AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsCrowdControlled () const
 
bool IsImmobilizedState () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
bool IsClientControlled (Player const *exactClient=nullptr) const
 
Player const * GetClientControlling () const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual void SetDualWieldMode (DualWieldMode mode)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (WeaponAttackType attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void DealDamageShieldDamage (Unit *victim)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (SpellInfo const *spellInfo, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
bool IsRooted () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
void SetDisableGravity (bool disable)
 
virtual bool SetSwim (bool enable)
 
void SetCanFly (bool enable)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
void SetWaterWalking (bool enable)
 
void SetFeatherFall (bool enable)
 
void SetHover (bool enable)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
bool IsStandUpOnMovementState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object, Milliseconds timed=0ms)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg) const
 -------—Pet responses methods--------------—
 
void SendPetActionSound (PetAction action) const
 
void SendPetDismissSound () const
 
void SendPetAIReaction (ObjectGuid guid) const
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
bool HasInLine (Position const *pos, float objSize, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
DualWieldMode _dualWieldMode
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ALEEventProcessor * ALEEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit ()
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool stun=false, bool logout=false)
 
void SendMoveRoot (bool state)
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed?
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::vector<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
340{
341 // set current spells as deletable
342 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
343 if (m_currentSpells[i])
344 {
346 m_currentSpells[i] = nullptr;
347 }
348
350
351 delete i_motionMaster;
352 delete m_charmInfo;
353 delete movespline;
354
357 ASSERT(m_attackers.empty());
358
359 // pussywizard: clear m_sharedVision along with back references
360 if (!m_sharedVision.empty())
361 {
362 do
363 {
364 Player* p = *(m_sharedVision.begin());
365 p->m_isInSharedVisionOf.erase(this);
366 m_sharedVision.remove(p);
367 } while (!m_sharedVision.empty());
368 }
369
370 ASSERT(m_Controlled.empty());
371 ASSERT(m_appliedAuras.empty());
372 ASSERT(m_ownedAuras.empty());
373 ASSERT(m_removedAuras.empty());
374 ASSERT(m_gameObj.empty());
375 ASSERT(m_dynObj.empty());
376
377 if (m_movedByPlayer && m_movedByPlayer != this)
378 LOG_INFO("misc", "Unit::~Unit (A1)");
379
381}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define CURRENT_MAX_SPELL
Definition Unit.h:546
Definition Player.h:1071
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2339
void SetReferencedFromCurrent(bool yes)
Definition Spell.h:571
bool m_duringRemoveFromWorld
Definition Unit.h:2207
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2121
AuraList m_removedAuras
Definition Unit.h:2125
ControlSet m_Controlled
Definition Unit.h:2032
Movement::MoveSpline * movespline
Definition Unit.h:2071
CharmInfo * m_charmInfo
Definition Unit.h:2142
MotionMaster * i_motionMaster
Definition Unit.h:2145
void _DeleteRemovedAuras()
Definition Unit.cpp:3872
DynObjectList m_dynObj
Definition Unit.h:2115
SafeUnitPointer m_movedByPlayer
Definition Unit.h:2034
AttackerSet m_attackers
Definition Unit.h:2107
Unit * m_attacking
Definition Unit.h:2108
GameObjectList m_gameObj
Definition Unit.h:2118
AuraMap m_ownedAuras
Definition Unit.h:2123
AuraApplicationMap m_appliedAuras
Definition Unit.h:2124
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition Unit.cpp:4397
SharedVisionList m_sharedVision
Definition Unit.h:2143

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( )
explicitprotected
206 : WorldObject(),
207 m_movedByPlayer(nullptr),
209 IsAIEnabled(false),
210 NeedChangeAI(false),
212 m_CreatedByPlayer(false),
214 i_AI(nullptr),
215 i_disabledAI(nullptr),
216 m_realRace(0),
217 m_race(0),
219 m_procDeep(0),
221 i_motionMaster(new MotionMaster(this)),
222 m_regenTimer(0),
223 m_ThreatMgr(this),
224 m_vehicle(nullptr),
225 m_vehicleKit(nullptr),
227 m_HostileRefMgr(this),
228 m_comboTarget(nullptr),
230{
231#ifdef _MSC_VER
232#pragma warning(default:4355)
233#endif
236
238
245
247
248 m_state = 0;
250
251 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
252 m_currentSpells[i] = nullptr;
253
254 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
255 m_SummonSlot[i].Clear();
256
257 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
258 m_ObjectSlot[i].Clear();
259
261
262 m_interruptMask = 0;
263 m_transform = 0;
264 m_canModifyStats = false;
265
266 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
267 m_spellImmune[i].clear();
268
269 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
270 {
275 }
276 // implement 50% base damage from offhand
278
279 for (uint8 i = 0; i < MAX_ATTACK; ++i)
280 {
283
284 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
285 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
286 }
287
288 for (uint8 i = 0; i < MAX_STATS; ++i)
289 m_createStats[i] = 0.0f;
290
291 m_attacking = nullptr;
292 m_modMeleeHitChance = 0.0f;
294 m_modSpellHitChance = 0.0f;
296
297 m_CombatTimer = 0;
298 m_lastManaUse = 0;
299
300 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
301 m_threatModifier[i] = 1.0f;
302
303 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
304 m_speed_rate[i] = 1.0f;
305
306 m_charmInfo = nullptr;
307
309
310 // remove aurastates allowing special moves
311 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
312 m_reactiveTimer[i] = 0;
313
314 m_cleanupDone = false;
316
318
319 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
324
325 m_applyResilience = false;
326 _instantCast = false;
327
328 _lastLiquid = nullptr;
329
330 _oldFactionId = 0;
331
332 _isWalkingBeforeCharm = false;
333
335}
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ SERVERSIDE_VISIBILITY_GHOST
Definition SharedDefines.h:1285
#define MAX_STATS
Definition SharedDefines.h:276
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:303
@ MAX_SUMMON_SLOT
Definition SharedDefines.h:3569
@ GHOST_VISIBILITY_ALIVE
Definition SharedDefines.h:1292
#define MAX_GAMEOBJECT_SLOT
Definition SharedDefines.h:3573
#define MAX_SPELL_IMMUNITY
Definition SharedDefines.h:1415
@ UNIT_MASK_NONE
Definition UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition UnitDefines.h:364
@ MINDAMAGE
Definition Unit.h:137
@ MAXDAMAGE
Definition Unit.h:138
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:168
@ UNIT_MOD_END
Definition Unit.h:170
@ OFF_ATTACK
Definition Unit.h:212
@ MAX_ATTACK
Definition Unit.h:214
@ BASE_ATTACK
Definition Unit.h:211
@ RANGED_ATTACK
Definition Unit.h:213
@ BASE_VALUE
Definition Unit.h:128
@ TOTAL_VALUE
Definition Unit.h:130
@ TOTAL_PCT
Definition Unit.h:131
@ BASE_PCT
Definition Unit.h:129
#define BASE_MAXDAMAGE
Definition Unit.h:42
@ MAX_REACTIVE
Definition Unit.h:608
#define BASE_MINDAMAGE
Definition Unit.h:41
@ UPDATEFLAG_LIVING
Definition UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:395
Definition MotionMaster.h:127
Definition MoveSpline.h:40
uint16 m_objectType
Definition Object.h:252
uint16 m_updateFlag
Definition Object.h:255
TypeID m_objectTypeId
Definition Object.h:254
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition Unit.h:2147
uint32 m_lastSanctuaryTime
Definition Unit.h:2048
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2158
uint32 m_transform
Definition Unit.h:2119
uint32 m_CombatTimer
Definition Unit.h:2190
bool m_canModifyStats
Definition Unit.h:2137
UnitAI * i_disabledAI
Definition Unit.h:2096
bool NeedChangeAI
Definition Unit.h:2055
uint32 m_state
Definition Unit.h:2189
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition Unit.h:2135
int32 m_attackTimer[MAX_ATTACK]
Definition Unit.h:2103
float m_modAttackSpeedPct[3]
Definition Unit.h:2045
uint8 m_realRace
Definition Unit.h:2098
Vehicle * m_vehicle
Definition Unit.h:2154
uint8 m_race
Definition Unit.h:2099
UnitAI * i_AI
Definition Unit.h:2095
uint32 _lastExtraAttackSpell
Definition Unit.h:2212
bool _instantCast
Definition Unit.h:2162
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition Unit.h:2037
RedirectThreatInfo _redirectThreatInfo
Definition Unit.h:2204
float m_createStats[MAX_STATS]
Definition Unit.h:2105
float m_modRangedHitChance
Definition Unit.h:2040
DeathState m_deathState
Definition Unit.h:2110
uint32 m_unitTypeMask
Definition Unit.h:2157
uint32 m_removedAurasCount
Definition Unit.h:2127
ThreatMgr m_ThreatMgr
Definition Unit.h:2150
Unit * m_comboTarget
Definition Unit.h:2200
AuraMap::iterator m_auraUpdateIterator
Definition Unit.h:2126
bool m_AutoRepeatFirstCast
Definition Unit.h:2101
uint16 m_delayed_unit_ai_notify_timer
Definition Unit.h:2067
int32 m_regenTimer
Definition Unit.h:2148
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2068
bool m_ControlledByPlayer
Definition Unit.h:2057
uint32 m_last_notify_mstime
Definition Unit.h:2065
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition Unit.h:2047
int8 m_comboPoints
Definition Unit.h:2201
uint32 _oldFactionId
faction before charm
Definition Unit.h:2209
int32 m_baseSpellCritChance
Definition Unit.h:2042
float m_modMeleeHitChance
Definition Unit.h:2039
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition Unit.h:2136
Position m_last_notify_position
Definition Unit.h:2064
Vehicle * m_vehicleKit
Definition Unit.h:2155
bool IsAIEnabled
Definition Unit.h:2054
HostileRefMgr m_HostileRefMgr
Definition Unit.h:2196
DualWieldMode _dualWieldMode
Definition Unit.h:2030
bool m_applyResilience
Definition Unit.h:2161
uint32 m_interruptMask
Definition Unit.h:2133
int32 m_procDeep
Definition Unit.h:2112
float m_speed_rate[MAX_MOVE_TYPE]
Definition Unit.h:2140
float m_modSpellHitChance
Definition Unit.h:2041
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition Unit.h:2036
bool m_cleanupDone
Definition Unit.h:2206
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition Unit.h:2210
bool m_CreatedByPlayer
Definition Unit.h:2058
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2066
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition Unit.h:2044
uint32 m_lastManaUse
Definition Unit.h:2191
WorldObject()
Definition Object.cpp:1039
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:613
void Relocate(float x, float y)
Definition Position.h:77
Definition ThreatMgr.h:293

References _dualWieldMode, _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, Alive, AUTO, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2185{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4483{
4485 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4486
4488
4489 if (aura->IsRemoved())
4490 return;
4491
4493 if (aura->IsSingleTarget())
4494 {
4495 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4496 /* @HACK: Player is not in world during loading auras.
4497 * Single target auras are not saved or loaded from database
4498 * but may be created as a result of aura links (player mounts with passengers)
4499 */
4500
4501 // register single target aura
4502 caster->GetSingleCastAuras().push_back(aura);
4503 // remove other single target auras
4504 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4505 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4506 {
4507 if ((*itr) != aura &&
4508 (*itr)->IsSingleTargetWith(aura))
4509 {
4510 (*itr)->Remove();
4511 itr = scAuras.begin();
4512 }
4513 else
4514 ++itr;
4515 }
4516 }
4517}
@ SPELL_AURA_CONTROL_VEHICLE
Definition SpellAuraDefines.h:299
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
bool IsRemoved() const
Definition SpellAuras.h:161
bool IsSingleTargetWith(Aura const *aura) const
Definition SpellAuras.cpp:1142
uint32 GetId() const
Definition SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:166
bool IsSingleTarget() const
Definition SpellAuras.h:164
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
bool IsSingleTarget() const
Definition SpellInfo.cpp:1374
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition Unit.cpp:4735
std::list< Aura * > AuraList
Definition Unit.h:667
bool IsDuringRemoveFromWorld() const
Definition Unit.h:688
AuraList & GetSingleCastAuras()
Definition Unit.h:1392

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5557{
5558 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5559 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5560}
@ AURA_EFFECT_HANDLE_STAT
Definition SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses(), and Player::GiveLevel().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4574{
4575 Aura* aura = aurApp->GetBase();
4576
4578
4579 if (aurApp->GetRemoveMode())
4580 return;
4581
4582 Unit* caster = aura->GetCaster();
4583
4584 // Update target aura state flag
4585 SpellInfo const* spellInfo = aura->GetSpellInfo();
4586 if (AuraStateType aState = spellInfo->GetAuraState())
4587 {
4588 uint32 aStateMask = (1 << (aState - 1));
4589 // force update so the new caster registers it
4590 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4592 else
4593 ModifyAuraState(aState, true);
4594 }
4595
4596 if (aurApp->GetRemoveMode())
4597 return;
4598
4599 // Sitdown on apply aura req seated
4602
4603 if (aurApp->GetRemoveMode())
4604 return;
4605
4606 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4607
4608 // apply effects of the aura
4609 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4610 {
4611 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4612 aurApp->_HandleEffect(i, true);
4613 }
4614
4615 sScriptMgr->OnAuraApply(this, aura);
4616}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1638
std::uint32_t uint32
Definition Define.h:107
#define sScriptMgr
Definition ScriptMgr.h:728
#define PER_CASTER_AURA_STATE_MASK
Definition SharedDefines.h:1329
AuraStateType
Definition SharedDefines.h:1299
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
void _HandleEffect(uint8 effIndex, bool apply)
Definition SpellAuras.cpp:161
Aura * GetBase() const
Definition SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:73
Definition SpellAuras.h:87
Unit * GetCaster() const
Definition SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition SpellAuras.cpp:1265
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:878
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2077
Definition SpellInfo.h:316
AuraStateType GetAuraState() const
Definition SpellInfo.cpp:2071
uint32 AuraInterruptFlags
Definition SpellInfo.h:353
Definition Unit.h:650
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:10573
void SetStandState(uint8 state)
Definition Unit.cpp:16748
bool IsSitState() const
Definition Unit.cpp:16724

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4560{
4561 ASSERT(aura);
4562 ASSERT(aura->HasEffect(effIndex));
4564 ASSERT(aurApp);
4565 if (!aurApp->GetEffectMask())
4566 _ApplyAura(aurApp, 1 << effIndex);
4567 else
4568 aurApp->_HandleEffect(effIndex, true);
4569}
Definition SpellAuras.h:37
uint8 GetEffectMask() const
Definition SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition SpellAuras.h:183
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition Unit.cpp:4573

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4522{
4523 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4525 // aura musn't be removed
4526 ASSERT(!aura->IsRemoved());
4527
4528 // aura mustn't be already applied on target
4529 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4530
4531 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4532 uint32 aurId = aurSpellInfo->Id;
4533
4534 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4535 // Xinef: Added IsAllowingDeadTarget check
4536 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4537 return nullptr;
4538
4539 Unit* caster = aura->GetCaster();
4540
4541 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4542 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4543
4544 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4545 // xinef: even if it gets removed, it will be reapplied in a second
4546 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4547 {
4548 m_interruptableAuras.push_back(aurApp);
4549 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4550 }
4551
4552 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4553 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4554
4555 aura->_ApplyForTarget(this, caster, aurApp);
4556 return aurApp;
4557}
WorldObject * GetOwner() const
Definition SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:492
bool IsPlayer() const
Definition Object.h:201
Player * ToPlayer()
Definition Object.h:202
bool IsDeathPersistent() const
Definition SpellInfo.cpp:1217
uint32 Id
Definition SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition SpellInfo.cpp:1227
void AddInterruptMask(uint32 mask)
Definition Unit.h:1563
bool IsAlive() const
Definition Unit.h:1748
AuraApplicationList m_interruptableAuras
Definition Unit.h:2131
AuraStateAurasMap m_auraStateAuras
Definition Unit.h:2132

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3873{
3874 while (!m_removedAuras.empty())
3875 {
3876 delete m_removedAuras.front();
3877 m_removedAuras.pop_front();
3878 }
3879}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19413{
19414 // Must be called only from aura handler
19415 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19416 return;
19417
19418 if (m_vehicle)
19419 {
19420 if (m_vehicle == vehicle)
19421 {
19422 if (seatId >= 0 && seatId != GetTransSeat())
19423 {
19424 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19425 ChangeSeat(seatId);
19426 }
19427
19428 return;
19429 }
19430 else
19431 {
19432 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19433 ExitVehicle();
19434 }
19435 }
19436
19437 if (!aurApp || aurApp->GetRemoveMode())
19438 return;
19439
19440 if (Player* player = ToPlayer())
19441 {
19442 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19443 return;
19444
19445 sScriptMgr->AnticheatSetUnderACKmount(player);
19446
19448 player->StopCastingCharm();
19449 player->StopCastingBindSight();
19450 Dismount();
19452
19453 // drop flag at invisible in bg
19454 if (Battleground* bg = player->GetBattleground())
19455 bg->EventPlayerDroppedFlag(player);
19456
19458 player->SendDirectMessage(&data);
19459 }
19460
19461 ASSERT(!m_vehicle);
19462 m_vehicle = vehicle;
19463
19464 if (!m_vehicle->AddPassenger(this, seatId))
19465 {
19466 m_vehicle = nullptr;
19467 return;
19468 }
19469
19470 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19472}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
Definition Battleground.h:294
uint32 GetEntry() const
Definition Object.h:116
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4188
void Dismount()
Definition Unit.cpp:13600
bool IsOnVehicle(Unit const *vehicle) const
Definition Unit.h:1881
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5178
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:19474
Vehicle * GetVehicleKit() const
Definition Unit.h:1879
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5249
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19493
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition Vehicle.cpp:318
int8 GetTransSeat() const
Definition Object.h:689
Definition WorldPacket.h:26
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition Opcodes.h:1211

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19531{
19532 if (!m_vehicle)
19533 return;
19534
19535 // This should be done before dismiss, because there may be some aura removal
19538
19539 Player* player = ToPlayer();
19540
19541 // If player is on mouted duel and exits the mount should immediatly lose the duel
19542 if (player && player->duel && player->duel->IsMounted)
19543 player->DuelComplete(DUEL_FLED);
19544
19545 Vehicle* vehicle = m_vehicle;
19546 Unit* vehicleBase = m_vehicle->GetBase();
19547 m_vehicle = nullptr;
19548
19549 if (!vehicleBase)
19550 return;
19551
19552 if (IsPlayer())
19554
19555 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19556
19557 Position pos;
19558 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19559 if (exitPosition)
19560 pos = *exitPosition;
19561 else
19562 {
19563 // Set exit position to vehicle position and use the current orientation
19564 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19565 pos.SetOrientation(vehicleBase->GetOrientation());
19566
19567 // Change exit position based on seat entry addon data
19568 if (seatAddon)
19569 {
19571 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19573 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19574 }
19575 }
19576
19578
19579 if (player)
19580 {
19582
19583 sScriptMgr->AnticheatSetUnderACKmount(player);
19584 }
19586 {
19588 data << GetPackGUID();
19589 SendMessageToSet(&data, false);
19590 }
19591
19592 // xinef: hack for flameleviathan seat vehicle
19593 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19594 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19595 {
19596 Movement::MoveSplineInit init(this);
19597 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19598 init.SetFacing(vehicleBase->GetOrientation());
19599 init.SetTransportExit();
19600 init.Launch();
19601 }
19602 else
19603 {
19604 float o = pos.GetAngle(this);
19605 Movement::MoveSplineInit init(this);
19606 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19607 init.SetFacing(GetOrientation());
19608 init.SetTransportExit();
19609 init.Launch();
19610 DisableSpline();
19611 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19613 }
19614
19615 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19616 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19617 {
19619 }
19620
19621 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19622 if (((Minion*)vehicleBase)->GetOwner() == this)
19623 {
19624 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19625 {
19626 vehicle->Dismiss();
19627 }
19628 else if (vehicleBase->IsCreature())
19629 {
19630 vehicle->Uninstall();
19631 vehicleBase->m_Events.AddEventAtOffset(new VehicleDespawnEvent(*vehicleBase, 2s), 2s);
19632 }
19633
19634 // xinef: ugly hack, no appripriate hook later to cast spell
19635 if (player)
19636 {
19637 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19638 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19639 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19640 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19641 }
19642 }
19643
19645 {
19646 // Vehicle just died, we die too
19647 if (vehicleBase->getDeathState() == DeathState::JustDied)
19649 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19650 else
19651 ToTempSummon()->UnSummon(2s); // Approximation
19652 }
19653
19654 if (player)
19655 {
19657 player->SetCanTeleport(true);
19658 }
19659}
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:904
@ DUEL_FLED
Definition SharedDefines.h:3880
@ MOVEMENTFLAG_ROOT
Definition UnitDefines.h:380
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition UnitDefines.h:189
@ VEHICLE_SPELL_PARACHUTE
Definition VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition VehicleDefines.h:70
void AddEventAtOffset(BasicEvent *event, Milliseconds offset, uint8 eventGroup=0)
Definition EventProcessor.h:108
Definition TemporarySummon.h:77
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:676
Definition MoveSplineInit.h:71
PackedGuid const & GetPackGUID() const
Definition Object.h:115
bool IsCreature() const
Definition Object.h:205
void SetCanTeleport(bool value)
Definition Player.h:2502
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6436
void SetFallInformation(uint32 time, float z)
Definition Player.h:2340
void SetExpectingChangeTransport(bool state)
Definition Player.h:2637
std::unique_ptr< DuelInfo > duel
Definition Player.h:1873
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14282
uint32 GetDelayedOperations() const
Definition Player.h:2098
virtual void UnSummon(Milliseconds msTime=0ms)
Definition TemporarySummon.cpp:287
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14578
Unit * GetOwner() const
Definition Unit.cpp:10676
DeathState getDeathState()
Definition Unit.h:1745
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition Unit.h:1713
TempSummon * ToTempSummon()
Definition Unit.h:716
void DisableSpline()
Definition Unit.cpp:637
void AddUnitState(uint32 f)
Definition Unit.h:720
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18070
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:759
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1194
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:726
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition Unit.cpp:19170
Definition Vehicle.h:101
Definition Vehicle.h:28
void Dismiss()
Definition Vehicle.cpp:541
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition Vehicle.cpp:462
void Uninstall()
Definition Vehicle.cpp:101
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition Vehicle.cpp:237
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2090
EventProcessor m_Events
Definition Object.h:731
@ SMSG_SPLINE_MOVE_UNROOT
Definition Opcodes.h:802
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition Position.h:27
void RelocateOffset(const Position &offset)
Definition Position.cpp:66
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void SetOrientation(float orientation)
Definition Position.h:116
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
float GetAngle(const Position *pos) const
Definition Position.cpp:85
Definition DBCStructure.h:2028
uint32 m_ID
Definition DBCStructure.h:2029
Definition VehicleDefines.h:86
float ExitParameterO
Definition VehicleDefines.h:96
float ExitParameterX
Definition VehicleDefines.h:93
float ExitParameterY
Definition VehicleDefines.h:94
float ExitParameterZ
Definition VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition VehicleDefines.h:97

References EventProcessor::AddEventAtOffset(), AddUnitState(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), Object::IsCreature(), Object::IsPlayer(), JustDied, KnockbackFrom(), Movement::MoveSplineInit::Launch(), WorldObject::m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Player::SetExpectingChangeTransport(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, VEHICLE_SPELL_SHADE_CONTROL_END, VehicleExitParamDest, and VehicleExitParamOffset.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14085{
14086 ASSERT(target);
14087
14088 // can assist to self
14089 if (this == target)
14090 return true;
14091
14092 // can't assist unattackable units or GMs
14093 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14094 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14095 return false;
14096
14097 // can't assist own vehicle or passenger
14098 if (m_vehicle)
14099 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14100 return false;
14101
14102 // can't assist invisible
14103 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14104 return false;
14105
14106 // can't assist dead
14107 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14108 return false;
14109
14110 // can't assist untargetable
14111 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14112 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14113 return false;
14114
14115 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14116 {
14117 // xinef: do not allow to assist non attackable units
14118 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14119 return false;
14120
14122 {
14123 if (target->IsImmuneToPC())
14124 return false;
14125 }
14126 else
14127 {
14128 if (target->IsImmuneToNPC())
14129 return false;
14130 }
14131 }
14132
14133 // can't assist non-friendly targets
14134 if (GetReactionTo(target) < REP_NEUTRAL
14135 && target->GetReactionTo(this) < REP_NEUTRAL
14136 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14137 return false;
14138
14139 // PvP case
14140 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14141 {
14142 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14144 {
14145 Player const* selfPlayerOwner = GetAffectingPlayer();
14146 if (selfPlayerOwner && targetPlayerOwner)
14147 {
14148 // can't assist player which is dueling someone
14149 if (selfPlayerOwner != targetPlayerOwner
14150 && targetPlayerOwner->duel)
14151 return false;
14152 }
14153 // can't assist player in ffa_pvp zone from outside
14154 if (target->IsFFAPvP() && !IsFFAPvP())
14155 return false;
14156
14157 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14158 if (target->IsPvP())
14159 if (IsInSanctuary() && !target->IsInSanctuary())
14160 return false;
14161 }
14162 }
14163 // PvC case - player can assist creature only if has specific type flags
14164 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14166 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14167 && !target->IsPvP())
14168 {
14169 if (Creature const* creatureTarget = target->ToCreature())
14170 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14171 }
14172 return true;
14173}
@ REP_NEUTRAL
Definition SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition SharedDefines.h:2732
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition SharedDefines.h:2718
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition SharedDefines.h:639
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition SharedDefines.h:628
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition SharedDefines.h:618
@ UNIT_STATE_UNATTACKABLE
Definition UnitDefines.h:211
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:255
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:279
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:257
Definition Creature.h:47
Creature * ToCreature()
Definition Object.h:206
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10115
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:732
bool IsInSanctuary() const
Definition Unit.h:1021
bool IsFFAPvP() const
Definition Unit.h:1023
Player * GetAffectingPlayer() const
Definition Unit.cpp:10701
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1733

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13962{
13963 ASSERT(target);
13964
13965 // can't attack self
13966 if (this == target)
13967 return false;
13968
13969 // can't attack unattackable units or GMs
13970 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13971 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13972 return false;
13973
13974 // can't attack own vehicle or passenger
13975 if (m_vehicle)
13976 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13977 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13978 return false;
13979
13980 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13981 //Ignore stealth if target is player and unit in combat with same player
13982 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13983 return false;
13984
13985 // can't attack dead
13986 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13987 return false;
13988
13989 // can't attack untargetable
13990 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13991 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13992 return false;
13993
13994 if (Player const* playerAttacker = ToPlayer())
13995 {
13996 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
13997 return false;
13998 }
13999 // check flags
14001 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
14002 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
14003 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
14004 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
14005 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
14006 return false;
14007
14008 // CvC case - can attack each other only when one of them is hostile
14010 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
14011
14012 // PvP, PvC, CvP case
14013 // can't attack friendly targets
14014 ReputationRank repThisToTarget = GetReactionTo(target);
14015 ReputationRank repTargetToThis;
14016
14017 if (repThisToTarget > REP_NEUTRAL
14018 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
14019 return false;
14020
14021 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
14022 if (repThisToTarget == REP_NEUTRAL &&
14023 repTargetToThis <= REP_NEUTRAL)
14024 {
14025 Player* owner = GetAffectingPlayer();
14026 Unit const* const thisUnit = owner ? owner : this;
14027 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
14028 !(target->IsCreature() && thisUnit->IsCreature()))
14029 {
14030 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
14031 Unit const* creature = target->IsCreature() ? target : thisUnit;
14032
14033 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14034 {
14035 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14036 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14037 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14038 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14039 return false;
14040 }
14041 }
14042 }
14043
14044 Creature const* creatureAttacker = ToCreature();
14045 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14046 return false;
14047
14048 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14049 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14050
14051 // check duel - before sanctuary checks
14052 if (playerAffectingAttacker && playerAffectingTarget)
14053 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14054 return true;
14055
14056 // PvP case - can't attack when attacker or target are in sanctuary
14057 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14058 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14059 return false;
14060
14061 // additional checks - only PvP case
14062 if (playerAffectingAttacker && playerAffectingTarget)
14063 {
14064 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14065 return false;
14066
14067 if (target->IsPvP())
14068 return true;
14069
14070 if (IsFFAPvP() && target->IsFFAPvP())
14071 return true;
14072
14074 }
14075 return true;
14076}
@ FACTION_FLAG_AT_WAR
Definition DBCEnums.h:308
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:368
@ PLAYER_FLAGS_UBER
Definition Player.h:487
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition SharedDefines.h:584
ReputationRank
Definition SharedDefines.h:179
@ REP_HOSTILE
Definition SharedDefines.h:181
@ UNIT_BYTE2_FLAG_UNK1
Definition UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:274
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition UnitDefines.h:270
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:261
#define WORLD_TRIGGER
Definition Unit.h:39
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:208
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:938
ReputationMgr & GetReputationMgr()
Definition Player.h:2125
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition ReputationMgr.h:106
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10085
bool IsPvP() const
Definition Unit.h:1022
bool HasStealthAura() const
Definition Unit.h:1796
bool IsInCombatWith(Unit const *who) const
Definition Unit.cpp:20916
bool IsImmuneToNPC() const
Definition Unit.h:912
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10287
bool IsImmuneToPC() const
Definition Unit.h:910
bool IsInCombat() const
Definition Unit.h:917
uint32 type_flags
Definition CreatureData.h:223
Definition DBCStructure.h:907
Definition ReputationMgr.h:41
Definition DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4765{
4766 if (apply)
4767 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4768 else
4769 m_modAuras[aurEff->GetAuraType()].erase(std::remove(m_modAuras[aurEff->GetAuraType()].begin(), m_modAuras[aurEff->GetAuraType()].end(), aurEff), m_modAuras[aurEff->GetAuraType()].end());
4770}
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:448
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition Unit.h:2129

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6218{
6219 m_dynObj.push_back(dynObj);
6220}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5551{
5552 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5553 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5554}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses(), and Player::GiveLevel().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2186{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4736{
4737 //SpellInfo const* spellProto = aura->GetSpellInfo();
4738
4739 // passive spell special case (only non stackable with ranks)
4740
4741 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4742 // if (spellProto->IsPassiveStackableWithRanks())
4743 // return;
4744
4745 bool remove = false;
4746 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4747 {
4748 if (remove)
4749 {
4750 remove = false;
4751 i = m_appliedAuras.begin();
4752 }
4753
4754 if (aura->CanStackWith(i->second->GetBase(), true))
4755 continue;
4756
4758 if (i == m_appliedAuras.end())
4759 break;
4760 remove = true;
4761 }
4762}
@ AURA_REMOVE_BY_DEFAULT
Definition SpellAuraDefines.h:392
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition SpellAuras.cpp:2021
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4844

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4423{
4424 ASSERT(casterGUID || caster);
4425 if (!casterGUID)
4426 casterGUID = caster->GetGUID();
4427
4428 // Xinef: Hax for mixology, best solution qq
4429 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4430 return nullptr;
4431
4432 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4433 if (!newAura->IsMultiSlotAura())
4434 {
4435 // check if cast item changed
4436 ObjectGuid castItemGUID;
4437 if (castItem)
4438 castItemGUID = castItem->GetGUID();
4439
4440 // find current aura from spell and change it's stackamount, or refresh it's duration
4441 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4442 {
4443 // effect masks do not match
4444 // extremely rare case
4445 // let's just recreate aura
4446 if (effMask != foundAura->GetEffectMask())
4447 return nullptr;
4448
4449 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4450 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4451 {
4452 if (!foundAura->HasEffect(i))
4453 continue;
4454
4455 int bp;
4456 if (baseAmount)
4457 bp = *(baseAmount + i);
4458 else
4459 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4460
4461 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4462 *oldBP = bp;
4463 }
4464
4465 // correct cast item guid if needed
4466 if (castItemGUID != foundAura->GetCastItemGUID())
4467 {
4468 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4469 *oldGUID = castItemGUID;
4470 }
4471
4472 // try to increase stack amount
4473 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4474 sScriptMgr->OnAuraApply(this, foundAura);
4475 return foundAura;
4476 }
4477 }
4478
4479 return nullptr;
4480}
std::int32_t int32
Definition Define.h:103
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition SpellInfo.h:198
#define sSpellMgr
Definition SpellMgr.h:825
Definition ObjectGuid.h:118
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:4828

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4715{
4716 // aura can be removed from unit only if it's applied on it, shouldn't happen
4717 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4718
4719 uint32 spellId = aurApp->GetBase()->GetId();
4720 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4721
4722 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4723 {
4724 if (iter->second == aurApp)
4725 {
4726 _UnapplyAura(iter, removeMode);
4727 return;
4728 }
4729 else
4730 ++iter;
4731 }
4732 ABORT();
4733}
#define ABORT
Definition Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition Unit.h:661
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition Unit.cpp:4619

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4620{
4621 AuraApplication* aurApp = i->second;
4622 ASSERT(aurApp);
4623 ASSERT(!aurApp->GetRemoveMode());
4624 ASSERT(aurApp->GetTarget() == this);
4625
4626 aurApp->SetRemoveMode(removeMode);
4627 Aura* aura = aurApp->GetBase();
4628 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4629
4630 // dead loop is killing the server probably
4631 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4632
4634
4635 Unit* caster = aura->GetCaster();
4636
4637 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4638 m_appliedAuras.erase(i);
4639
4640 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4641 // xinef: event if it gets removed, it will be reapplied in a second
4642 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4643 {
4644 m_interruptableAuras.remove(aurApp);
4646 }
4647
4648 bool auraStateFound = false;
4649 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4650 if (auraState)
4651 {
4652 bool canBreak = false;
4653 // Get mask of all aurastates from remaining auras
4654 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4655 {
4656 if (itr->second == aurApp)
4657 {
4658 m_auraStateAuras.erase(itr);
4659 itr = m_auraStateAuras.lower_bound(auraState);
4660 canBreak = true;
4661 continue;
4662 }
4663 auraStateFound = true;
4664 ++itr;
4665 }
4666 }
4667
4668 aurApp->_Remove();
4669 aura->_UnapplyForTarget(this, caster, aurApp);
4670
4671 // remove effects of the spell - needs to be done after removing aura from lists
4672 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4673 {
4674 if (aurApp->HasEffect(itr))
4675 aurApp->_HandleEffect(itr, false);
4676 }
4677
4678 // all effect mustn't be applied
4679 ASSERT(!aurApp->GetEffectMask());
4680
4681 // Remove totem at next update if totem loses its aura
4682 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4683 {
4684 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4686 }
4687
4688 // Remove aurastates only if needed and were not found
4689 if (auraState)
4690 {
4691 if (!auraStateFound)
4692 ModifyAuraState(auraState, false);
4693 else
4694 {
4695 // update for casters, some shouldn't 'see' the aura state
4696 uint32 aStateMask = (1 << (auraState - 1));
4697 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4699 }
4700 }
4701
4702 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4703
4704 // only way correctly remove all auras from list
4705 //if (removedAuras != m_removedAurasCount) new aura may be added
4706 i = m_appliedAuras.begin();
4707
4708 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4709
4710 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4711 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4712}
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition Totem.h:25
Unit * GetTarget() const
Definition SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition SpellAuras.h:72
void _Remove()
Definition SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:515
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition CreatureAI.h:232
CreatureAI * AI() const
Definition Creature.h:145
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition TemporarySummon.cpp:395
Totem * ToTotem()
Definition Unit.h:715
void UpdateInterruptMask()
Definition Unit.cpp:768
bool IsTotem() const
Definition Unit.h:782

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), JustDied, LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6223{
6224 m_dynObj.remove(dynObj);
6225}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3940{
3941 SpellInfo const* spellProto = nullptr;
3943 {
3945 }
3946
3947 if (!spellProto)
3948 {
3949 return;
3950 }
3951
3952 static uint32 const HUNTER_AUTOSHOOT = 75;
3953
3954 // Check "realtime" interrupts
3955 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3956 {
3957 // cancel wand shoot
3958 if (spellProto->Id != HUNTER_AUTOSHOOT)
3960 m_AutoRepeatFirstCast = true;
3961 return;
3962 }
3963
3964 // Apply delay (Hunter's autoshoot not affected)
3965 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3966 {
3968 }
3969
3970 m_AutoRepeatFirstCast = false;
3971
3972 // Check for ranged attack timer
3974 {
3976 if (result != SPELL_CAST_OK)
3977 {
3978 if (spellProto->Id != HUNTER_AUTOSHOOT)
3979 {
3981 }
3982
3983 return;
3984 }
3985
3986 // We want to shoot
3987 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3988 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3989
3990 // Reset attack
3992 }
3993}
SpellCastResult
Definition SharedDefines.h:959
@ SPELL_CAST_OK
Definition SharedDefines.h:1149
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:542
Definition Spell.h:295
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3391
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5592
SpellInfo const *const m_spellInfo
Definition Spell.h:531
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4116
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4158
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:868
bool isMoving() const
Definition Unit.h:1663
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:870
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:871
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:643

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3882{
3885
3886 // remove finished spells from current pointers
3887 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3888 {
3889 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3890 {
3892 m_currentSpells[i] = nullptr; // remove pointer
3893 }
3894 }
3895
3896 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3898 {
3899 Aura* i_aura = m_auraUpdateIterator->second;
3900 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3901 i_aura->UpdateOwner(time, this);
3902 }
3903
3904 // remove expired auras - do that after updates(used in scripts?)
3905 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3906 {
3907 if (i->second->IsExpired())
3909 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3910 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3911 else
3912 ++i;
3913 }
3914
3915 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3916 if (itr->second->IsNeedClientUpdate())
3917 itr->second->ClientUpdate();
3918
3920
3921 if (!m_gameObj.empty())
3922 {
3923 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3924 {
3925 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3926 if (!go->isSpawned())
3927 {
3928 go->SetOwnerGUID(ObjectGuid::Empty);
3929 go->SetRespawnTime(0);
3930 go->Delete();
3931 m_gameObj.erase(itr++);
3932 continue;
3933 }
3934 ++itr;
3935 }
3936 }
3937}
@ AURA_REMOVE_BY_CANCEL
Definition SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition Spell.h:237
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition SpellAuras.cpp:756
Definition GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4773
void _UpdateAutoRepeatSpell()
Definition Unit.cpp:3939
VisibleAuraMap m_visibleAuras
Definition Unit.h:2138
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:115

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18906{
18907 if (!spellInfo)
18908 return nullptr;
18909
18910 if (target->IsImmunedToSpell(spellInfo))
18911 return nullptr;
18912
18913 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18914 {
18915 if (!(effMask & (1 << i)))
18916 continue;
18917 if (target->IsImmunedToSpellEffect(spellInfo, i))
18918 effMask &= ~(1 << i);
18919 }
18920
18921 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18922 {
18923 aura->ApplyForTargets();
18924 return aura;
18925 }
18926 return nullptr;
18927}
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition SpellAuras.cpp:326
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition Unit.cpp:13081
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition Unit.cpp:12991

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18891{
18892 if (!target)
18893 return nullptr;
18894
18895 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18896 if (!spellInfo)
18897 return nullptr;
18898
18899 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18900 return nullptr;
18901
18902 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18903}
#define MAX_EFFECT_MASK
Definition DBCStructure.h:1639
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition SharedDefines.h:467
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:399
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:18890

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pallid_horror::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
1001{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition Unit.h:2202

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
998{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition Unit.cpp:16860

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16861{
16862 if (!count)
16863 {
16864 return;
16865 }
16866
16867 if (target && target != m_comboTarget)
16868 {
16869 if (m_comboTarget)
16870 {
16872 }
16873
16874 m_comboTarget = target;
16875 m_comboPoints = count;
16876 target->AddComboPointHolder(this);
16877 }
16878 else
16879 {
16880 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16881 }
16882
16884}
void SendComboPoints()
Definition Unit.cpp:16903
void AddComboPointHolder(Unit *unit)
Definition Unit.h:1001
void RemoveComboPointHolder(Unit *unit)
Definition Unit.h:1002

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2805{
2807 if (!targetGUID)
2808 {
2809 if (ObjectGuid selection = GetTarget())
2810 {
2811 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2812 }
2813 else
2814 return;
2815 }
2816
2817 extraAttacksTargets[targetGUID] += count;
2818}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition Unit.h:2213
ObjectGuid _lastDamagedTargetGuid
Definition Unit.h:2214
ObjectGuid GetTarget() const
Definition Unit.h:844

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
763{ m_movementInfo.flags2 |= f; }
MovementInfo m_movementInfo
Definition Object.h:693
uint16 flags2
Definition Object.h:292

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition Unit.h:2198

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6279{
6280 if (!gameObj || gameObj->GetOwnerGUID())
6281 return;
6282
6283 m_gameObj.push_back(gameObj->GetGUID());
6284 gameObj->SetOwnerGUID(GetGUID());
6285
6286 if (IsPlayer() && gameObj->GetSpellId())
6287 {
6288 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6289 // Need disable spell use for owner
6290 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6291 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6292 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6293 }
6294}
uint32 GetSpellId() const
Definition GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10929
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1563{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17320{
17321 if (!IsPlayer())
17322 return;
17323
17324 m_petAuras.insert(petSpell);
17325 if (Pet* pet = ToPlayer()->GetPet())
17326 pet->CastPetAura(petSpell);
17327 else if (Unit* charm = GetCharm())
17328 charm->CastPetAura(petSpell);
17329}
Definition Pet.h:41
Unit * GetCharm() const
Definition Unit.cpp:10747
PetAuraSet m_petAuras
Definition Unit.h:2052
Pet * GetPet(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:215

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11246{
11247 if (m_sharedVision.empty())
11248 setActive(true);
11249
11250 m_sharedVision.push_back(player);
11251 player->m_isInSharedVisionOf.insert(this);
11252}
void setActive(bool isActiveObject)
Definition Object.cpp:1065

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1975{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition Unit.h:2061

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14679{
14680 // Only mobs can manage threat lists
14682 {
14683 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14684 }
14685}
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition Unit.h:721
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition Unit.cpp:14639

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), boss_eck::boss_eckAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), npc_molten_golem::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from Object.

15700{
15701 if (!IsInWorld())
15702 {
15704 }
15705}
void AddToWorld() override
Definition Object.cpp:1197

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
720{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), SetRooted(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
727{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17077{
17078 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17079 if (val > 0)
17080 {
17082 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17083 }
17084 else
17085 {
17087 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17088 }
17089 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17090}
std::uint16_t uint16
Definition Define.h:108
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Util.h:50
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:818
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:897

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17093{
17094 if (val > 0)
17096 else
17098}
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15152{
15153 // Checking for existing in the table
15154 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15155 {
15156 if (i->DRGroup != group)
15157 continue;
15158
15159 if (apply)
15160 i->stack += 1;
15161 else if (i->stack)
15162 {
15163 i->stack -= 1;
15164 // Remember time after last aura from group removed
15165 if (i->stack == 0)
15166 i->hitTime = GameTime::GetGameTimeMS().count();
15167 }
15168 break;
15169 }
15170}
Diminishing m_Diminishing
Definition Unit.h:2194
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15073{
15074 // xinef: dont apply diminish to self casts
15075 if (duration == -1 || group == DIMINISHING_NONE)
15076 return 1.0f;
15077
15078 // test pet/charm masters instead pets/charmeds
15079 Unit const* targetOwner = GetOwner();
15080 Unit const* casterOwner = caster->GetOwner();
15081
15082 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15083 if (limitduration > 0 && duration > limitduration)
15084 {
15085 Unit const* target = targetOwner ? targetOwner : this;
15086 Unit const* source = casterOwner ? casterOwner : caster;
15087
15088 if ((target->IsPlayer()
15090 && source->IsPlayer())
15091 duration = limitduration;
15092 }
15093
15094 float mod = 1.0f;
15095
15096 if (group == DIMINISHING_TAUNT)
15097 {
15099 {
15100 DiminishingLevels diminish = Level;
15101 switch (diminish)
15102 {
15104 break;
15106 mod = 0.65f;
15107 break;
15109 mod = 0.4225f;
15110 break;
15112 mod = 0.274625f;
15113 break;
15115 mod = 0.0f;
15116 break;
15117 default:
15118 break;
15119 }
15120 }
15121 }
15122 // Some diminishings applies to mobs too (for example, Stun)
15124 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15125 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15127 {
15128 DiminishingLevels diminish = Level;
15129 switch (diminish)
15130 {
15132 break;
15134 mod = 0.5f;
15135 break;
15137 mod = 0.25f;
15138 break;
15140 mod = 0.0f;
15141 break;
15142 default:
15143 break;
15144 }
15145 }
15146
15147 duration = int32(duration * mod);
15148 return mod;
15149}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition SharedDefines.h:3508
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3526
@ DRTYPE_PLAYER
Definition SharedDefines.h:3501
@ DRTYPE_ALL
Definition SharedDefines.h:3502
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition SpellMgr.cpp:245
DiminishingLevels
Definition Unit.h:264
@ DIMINISHING_LEVEL_3
Definition Unit.h:267
@ DIMINISHING_LEVEL_1
Definition Unit.h:265
@ DIMINISHING_LEVEL_4
Definition Unit.h:269
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:268
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:270
@ DIMINISHING_LEVEL_2
Definition Unit.h:266
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:77

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14855{
14856 if (Player* modOwner = GetSpellModOwner())
14857 {
14858 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14859 switch (effect_index)
14860 {
14861 case 0:
14862 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14863 break;
14864 case 1:
14865 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14866 break;
14867 case 2:
14868 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14869 break;
14870 }
14871 }
14872 return value;
14873}
@ SPELLMOD_EFFECT2
Definition SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition SpellDefines.h:79
Player * GetSpellModOwner() const
Definition Unit.cpp:16584

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
18955{
18956 // player mounted on multi-passenger mount is also classified as vehicle
18957 if (victim->IsVehicle() && !victim->IsPlayer())
18958 return;
18959
18960 Unit const* target = nullptr;
18961 if (victim->IsPlayer())
18962 target = victim;
18963 else if (victim->IsCreature())
18964 {
18965 if (Unit* owner = victim->GetOwner())
18966 if (owner->IsPlayer())
18967 target = owner;
18968 }
18969
18970 if (!target)
18971 return;
18972
18973 switch (type)
18974 {
18976 // Crit chance reduction works against nonpets
18977 if (crit)
18978 *crit -= target->GetMeleeCritChanceReduction();
18979 if (damage)
18980 {
18981 if (isCrit)
18982 *damage -= target->GetMeleeCritDamageReduction(*damage);
18983 *damage -= target->GetMeleeDamageReduction(*damage);
18984 }
18985 break;
18987 // Crit chance reduction works against nonpets
18988 if (crit)
18989 *crit -= target->GetRangedCritChanceReduction();
18990 if (damage)
18991 {
18992 if (isCrit)
18993 *damage -= target->GetRangedCritDamageReduction(*damage);
18994 *damage -= target->GetRangedDamageReduction(*damage);
18995 }
18996 break;
18998 // Crit chance reduction works against nonpets
18999 if (crit)
19000 *crit -= target->GetSpellCritChanceReduction();
19001 if (damage)
19002 {
19003 if (isCrit)
19004 *damage -= target->GetSpellCritDamageReduction(*damage);
19005 *damage -= target->GetSpellDamageReduction(*damage);
19006 }
19007 break;
19008 default:
19009 break;
19010 }
19011}
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:234
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:235
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:233
float GetSpellCritChanceReduction() const
Definition Unit.h:1239
float GetRangedCritChanceReduction() const
Definition Unit.h:1238
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition Unit.h:1243
float GetMeleeCritChanceReduction() const
Definition Unit.h:1237
uint32 GetRangedDamageReduction(uint32 damage) const
Definition Unit.h:1231
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition Unit.h:1242
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition Unit.h:1241
uint32 GetSpellDamageReduction(uint32 damage) const
Definition Unit.h:1232
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition Unit.h:1230

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1167{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:811
void apply(T *val)
Definition ByteConverter.h:40

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13492{
13493 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13494
13495 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13496 {
13497 // Create dispel mask by dispel type
13498 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13499 // Dispel all existing auras vs current dispel type
13501 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13502 {
13503 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13504 if (spell->GetDispelMask() & dispelMask)
13505 {
13506 // Dispel aura
13507 RemoveAura(itr);
13508 }
13509 else
13510 ++itr;
13511 }
13512 }
13513}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition SharedDefines.h:445
@ IMMUNITY_DISPEL
Definition SharedDefines.h:1409
uint32 GetDispelMask() const
Definition SpellInfo.cpp:2052
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13464
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:659
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1346

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13465{
13466 if (apply)
13467 {
13468 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13469 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13470 return;
13471
13472 SpellImmune immune;
13473 immune.spellId = spellId;
13474 immune.type = type;
13475 immune.blockType = blockType;
13476 m_spellImmune[op].push_back(std::move(immune));
13477 }
13478 else
13479 {
13480 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13481 {
13482 if (itr->spellId == spellId && itr->type == type)
13483 {
13484 m_spellImmune[op].erase(itr);
13485 break;
13486 }
13487 }
13488 }
13489}
Definition Unit.cpp:13455
Definition SpellDefines.h:174
uint32 blockType
Definition SpellDefines.h:179
uint32 spellId
Definition SpellDefines.h:177
uint32 type
Definition SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_intellect_spirit_resilience_scaling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_necrotic_shard::npc_necrotic_shard(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), npc_sanguine_spirit::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and Creature::UpdateEntry().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1061{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15363{
15364 if (val == -100.0f) // prevent set var to zero
15365 val = -99.99f;
15366 float var = GetStat(stat) * val / 100.0f;
15367 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15368}
float GetStat(Stats stat) const
Definition Unit.h:1036

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14667{
14668 if (!HasThreatAura() || fThreat < 0)
14669 return fThreat;
14670
14671 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14672
14673 return fThreat * m_threatModifier[school];
14674}
SpellSchools
Definition SharedDefines.h:293
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition SharedDefines.h:329
bool HasThreatAura() const
Definition Unit.h:1786

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10324{
10325 if (!victim || victim == this)
10326 return false;
10327
10328 // dead units can neither attack nor be attacked
10329 if (!IsAlive() || !victim->IsAlive())
10330 return false;
10331
10332 // pussywizard: check map, world, phase >_> multithreading crash fix
10333 if (!IsInMap(victim) || !InSamePhase(victim))
10334 return false;
10335
10336 // player cannot attack in mount state
10337 if (IsPlayer() && IsMounted())
10338 return false;
10339
10340 // creatures cannot attack while evading
10341 Creature* creature = ToCreature();
10342 if (creature && creature->IsInEvadeMode())
10343 {
10344 return false;
10345 }
10346
10347 // creatures should not try to attack the player during polymorph
10348 if (creature && creature->IsPolymorphed())
10349 {
10350 return false;
10351 }
10352
10353 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10354 // return false;
10355
10356 // nobody can attack GM in GM-mode
10357 if (victim->IsPlayer())
10358 {
10359 if (victim->ToPlayer()->IsGameMaster())
10360 return false;
10361 }
10362 else
10363 {
10364 if (victim->ToCreature()->IsEvadingAttacks())
10365 return false;
10366 }
10367
10368 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10370 return false;
10371
10372 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10373 if (HasUnattackableAura())
10375
10376 if (m_attacking)
10377 {
10378 if (m_attacking == victim)
10379 {
10380 // switch to melee attack from ranged/magic
10381 if (meleeAttack)
10382 {
10384 {
10386 SendMeleeAttackStart(victim);
10387 return true;
10388 }
10389 }
10391 {
10393 SendMeleeAttackStop(victim);
10394 return true;
10395 }
10396 return false;
10397 }
10398
10399 // switch target
10400 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10401 if (!meleeAttack)
10403 }
10404
10405 if (m_attacking)
10407
10408 m_attacking = victim;
10410
10411 // Set our target
10412 SetTarget(victim->GetGUID());
10413
10414 if (meleeAttack)
10416
10417 Unit* owner = GetCharmerOrOwner();
10418 Creature* ownerCreature = owner ? owner->ToCreature() : nullptr;
10419 Creature* controlledCreatureWithSameVictim = nullptr;
10420 if (creature && !m_Controlled.empty())
10421 {
10422 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10423 {
10424 if ((*itr)->ToCreature() && (*itr)->GetVictim() == victim)
10425 {
10426 controlledCreatureWithSameVictim = (*itr)->ToCreature();
10427 break;
10428 }
10429 }
10430 }
10431
10432 // Share leash timer with controlled unit
10433 if (controlledCreatureWithSameVictim)
10434 creature->SetLastLeashExtensionTimePtr(controlledCreatureWithSameVictim->GetLastLeashExtensionTimePtr());
10435 // Share leash timer with owner
10436 else if (creature && ownerCreature && ownerCreature->GetVictim() == victim)
10438 // Update leash timer when attacking creatures
10439 else if (victim->IsCreature())
10441
10442 // set position before any AI calls/assistance
10443 //if (IsCreature())
10444 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10445 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10446 {
10447 // should not let player enter combat by right clicking target - doesn't helps
10448 SetInCombatWith(victim);
10449 if (victim->IsPlayer())
10450 victim->SetInCombatWith(this);
10451
10452 AddThreat(victim, 0.0f);
10453
10455
10458 creature->CallAssistance();
10459
10461
10463 }
10464
10465 // delay offhand weapon attack by 50% of the base attack time
10468
10469 if (meleeAttack)
10470 SendMeleeAttackStart(victim);
10471
10472 return true;
10473}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition CreatureData.h:70
@ EMOTE_ONESHOT_NONE
Definition SharedDefines.h:1905
@ AI_REACTION_HOSTILE
Definition SharedDefines.h:3492
@ SPELL_AURA_MOD_UNATTACKABLE
Definition SpellAuraDefines.h:156
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition Unit.h:539
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
T CalculatePct(T base, U pct)
Definition Util.h:61
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition WorldConfig.h:236
void CallAssistance(Unit *target=nullptr)
Definition Creature.cpp:2437
bool IsEvadingAttacks() const
Definition Creature.h:140
std::shared_ptr< time_t > const & GetLastLeashExtensionTimePtr() const
Definition Creature.cpp:3585
void UpdateLeashExtensionTime()
Definition Creature.cpp:3607
void SetAssistanceTimer(uint32 value)
Definition Creature.h:411
void SetLastLeashExtensionTimePtr(std::shared_ptr< time_t > const &timer)
Definition Creature.cpp:3592
void SendAIReaction(AiReaction reactionType)
Definition Creature.cpp:2425
bool IsInEvadeMode() const
Definition Creature.h:139
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
bool IsGameMaster() const
Definition Player.h:1161
bool HasOffhandWeaponForAttack() const
Definition Unit.h:968
void ClearUnitState(uint32 f)
Definition Unit.h:722
bool IsPolymorphed() const
Definition Unit.cpp:16763
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition Unit.cpp:14678
void _removeAttacker(Unit *pAttacker)
Definition Unit.h:2186
void _addAttacker(Unit *pAttacker)
Definition Unit.h:2185
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition Unit.cpp:13658
bool HasUnattackableAura() const
Definition Unit.h:1788
Unit * GetCharmerOrOwner() const
Definition Unit.h:1253
bool IsMounted() const
Definition Unit.h:1841
Unit * GetVictim() const
Definition Unit.h:886
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3098
bool IsControllableGuardian() const
Definition Unit.h:779
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21200
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition Unit.cpp:3114
bool IsControlledByPlayer() const
Definition Unit.h:1274
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1759
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0
bool InSamePhase(WorldObject const *obj) const
Definition Object.h:514
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1318
#define sWorld
Definition World.h:316

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), GetCharmerOrOwner(), Object::GetFloatValue(), Object::GetGUID(), Creature::GetLastLeashExtensionTimePtr(), GetVictim(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, m_Controlled, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), Creature::SetLastLeashExtensionTimePtr(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2601{
2603 {
2604 return;
2605 }
2606
2607 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2608 {
2609 return;
2610 }
2611
2612 if (!victim->IsAlive())
2613 return;
2614
2615 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2616 return;
2617
2618 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2619 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2620
2621 CombatStart(victim);
2623
2624 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2625 return; // ignore ranged case
2626
2627 if (!extra && _lastExtraAttackSpell)
2628 {
2630 }
2631
2632 bool meleeAttack = true;
2633
2634 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2635 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2636 {
2637 meleeAttack = false; // The melee attack is replaced by the melee spell
2638
2640 SpellCastResult castResult = meleeSpell->CheckCast(false);
2641 if (castResult != SPELL_CAST_OK)
2642 {
2643 meleeSpell->SendCastResult(castResult);
2644 meleeSpell->SendInterrupted(0);
2645
2646 meleeSpell->finish(false);
2647 meleeSpell->SetExecutedCurrently(false);
2648
2649 if (castResult == SPELL_FAILED_NO_POWER)
2650 {
2651 // Not enough rage, do a regular melee attack instead
2652 meleeAttack = true;
2653 }
2654 }
2655 else
2656 {
2657 meleeSpell->cast(true);
2658 }
2659 }
2660 if (meleeAttack)
2661 {
2662 // attack can be redirected to another target
2663 victim = GetMeleeHitRedirectTarget(victim);
2664 CalcDamageInfo damageInfo;
2665 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2666
2667 // Send log damage message to client
2668 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2669 {
2670 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2671 }
2672
2673 // Related to sparring system. Allow attack animations even if there are no damages
2674 if (victim->CanSparringWith(damageInfo.attacker))
2675 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2676
2677 SendAttackStateUpdate(&damageInfo);
2678
2679 //TriggerAurasProcOnEvent(damageInfo);
2680
2681 _lastDamagedTargetGuid = victim->GetGUID();
2682
2683 DealMeleeDamage(&damageInfo, true);
2684
2685 DamageInfo dmgInfo(damageInfo);
2686 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2687 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2688
2689 if (IsPlayer())
2690 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2691 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2692 else
2693 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2694 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2695
2696 // Let the pet know we've started attacking someting. Handles melee attacks only
2697 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2698 if (IsPlayer() && !m_Controlled.empty())
2699 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2700 if (Unit* pet = *itr)
2701 if (pet->IsAlive() && pet->IsCreature())
2702 pet->ToCreature()->AI()->OwnerAttacked(victim);
2703 }
2704}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ SPELL_FAILED_NO_POWER
Definition SharedDefines.h:1045
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition SpellDefines.h:55
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition UnitDefines.h:218
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:271
@ HITINFO_FAKE_DAMAGE
Definition Unit.h:123
Definition Unit.h:332
std::string ToString() const
Definition ObjectGuid.cpp:47
void cast(bool skipCheck=false)
Definition Spell.cpp:3709
void SetExecutedCurrently(bool yes)
Definition Spell.h:573
void SendInterrupted(uint8 result)
Definition Spell.cpp:5112
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4607
void finish(bool ok=true)
Definition Spell.cpp:4415
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:6578
void CombatStart(Unit *target, bool initialAggro=true)
Definition Unit.cpp:13703
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:11133
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition Unit.cpp:1496
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:6477
uint8 getStandState() const
Definition Unit.h:1735
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1861
bool CanSparringWith(Unit const *attacker) const
Definition Unit.cpp:3995
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:814
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition Object.cpp:1380
Definition Unit.h:465
uint32 procAttacker
Definition Unit.h:482
uint32 procVictim
Definition Unit.h:483
uint32 absorb
Definition Unit.h:473
struct CalcDamageInfo::@266 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition Unit.h:472
uint32 procEx
Definition Unit.h:484
uint32 HitInfo
Definition Unit.h:478
Unit * attacker
Definition Unit.h:466
Unit * target
Definition Unit.h:467
WeaponAttackType attackType
Definition Unit.h:481
std::string ToString() const
Definition Position.cpp:59

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10480{
10481 if (!m_attacking)
10482 return false;
10483
10484 Unit* victim = m_attacking;
10485
10487 m_attacking = nullptr;
10488
10489 // Clear our target
10491
10493
10495
10496 // reset only at real combat stop
10497 if (Creature* creature = ToCreature())
10498 {
10499 creature->SetNoCallAssistance(false);
10500
10501 if (creature->HasSearchedAssistance())
10502 {
10503 creature->SetNoSearchAssistance(false);
10504 }
10505 }
10506
10507 SendMeleeAttackStop(victim);
10508
10509 return true;
10510}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_felmyst::ScheduleGroundAbilities(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_attumen::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10613{
10615 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10616 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10617 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10618 auraStates |= (1 << (itr->first - 1));
10619
10620 return auraStates;
10621}
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20873{
20874 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20875 data << GetGUID();
20876 data << uint8(flags);
20877 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
20878 {
20879 data << uint32(itr->first);
20880 data << uint32(itr->second);
20881 }
20882}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_SPELL_COOLDOWN
Definition Opcodes.h:338

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2084{
2085 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2086 *data << GetPackGUID();
2087 BuildMovementPacket(data);
2088}
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19661
@ MSG_MOVE_HEARTBEAT
Definition Opcodes.h:268

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19662{
19663 *data << uint32(GetUnitMovementFlags()); // movement flags
19664 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19665 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19666 *data << GetPositionX();
19667 *data << GetPositionY();
19668 *data << GetPositionZ();
19669 *data << GetOrientation();
19670
19671 // 0x00000200
19673 {
19674 if (m_vehicle)
19675 *data << m_vehicle->GetBase()->GetPackGUID();
19676 else if (GetTransport())
19677 *data << GetTransport()->GetPackGUID();
19678 else
19679 *data << (uint8)0;
19680
19681 *data << float (GetTransOffsetX());
19682 *data << float (GetTransOffsetY());
19683 *data << float (GetTransOffsetZ());
19684 *data << float (GetTransOffsetO());
19685 *data << uint32(GetTransTime());
19686 *data << uint8 (GetTransSeat());
19687
19690 }
19691
19692 // 0x02200000
19695 *data << (float)m_movementInfo.pitch;
19696
19697 *data << (uint32)m_movementInfo.fallTime;
19698
19699 // 0x00001000
19701 {
19702 *data << (float)m_movementInfo.jump.zspeed;
19703 *data << (float)m_movementInfo.jump.sinAngle;
19704 *data << (float)m_movementInfo.jump.cosAngle;
19705 *data << (float)m_movementInfo.jump.xyspeed;
19706 }
19707
19708 // 0x04000000
19710 *data << (float)m_movementInfo.splineElevation;
19711}
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:378
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:394
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:381
@ MOVEMENTFLAG_SWIMMING
Definition UnitDefines.h:390
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition UnitDefines.h:395
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition UnitDefines.h:432
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition UnitDefines.h:437
uint32 GetUnitMovementFlags() const
Definition Unit.h:760
uint16 GetExtraUnitMovementFlags() const
Definition Unit.h:766
float GetTransOffsetX() const
Definition Object.h:684
float GetTransOffsetY() const
Definition Object.h:685
float GetTransOffsetZ() const
Definition Object.h:686
uint32 GetTransTime() const
Definition Object.h:688
Transport * GetTransport() const
Definition Object.h:683
float GetTransOffsetO() const
Definition Object.h:687
float cosAngle
Definition Object.h:329
float xyspeed
Definition Object.h:329
float zspeed
Definition Object.h:329
float sinAngle
Definition Object.h:329
uint32 time2
Definition Object.h:312
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition Object.h:319
struct MovementInfo::TransportInfo transport
float splineElevation
Definition Object.h:333
float pitch
Definition Object.h:316

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), and SendTeleportPacket().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20586{
20587 if (!target)
20588 return;
20589
20591 uint32 visibleFlag = UF_FLAG_PUBLIC;
20592
20593 if (target == this)
20594 visibleFlag |= UF_FLAG_PRIVATE;
20595
20597 if (GetOwnerGUID() == target->GetGUID())
20598 visibleFlag |= UF_FLAG_OWNER;
20599
20602 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20603
20604 if (plr && plr->IsInSameRaidWith(target))
20605 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20606
20607 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20608
20609 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20610 if (cacheIt != _valuesUpdateCache.end())
20611 {
20612 int32 cachePos = static_cast<int32>(data->wpos());
20613 data->append(cacheIt->second.buffer);
20614
20615 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20616 if (cachePos)
20617 dataAdjustedPos.ApplyOffset(cachePos);
20618
20619 PatchValuesUpdate(*data, dataAdjustedPos, target);
20620
20621 return;
20622 }
20623
20624 BuildValuesCachedBuffer cacheValue(500);
20625
20626 ByteBuffer fieldBuffer(400);
20627
20628 UpdateMask updateMask;
20629 updateMask.SetCount(m_valuesCount);
20630
20631 for (uint16 index = 0; index < m_valuesCount; ++index)
20632 {
20633 if (_fieldNotifyFlags & flags[index] ||
20634 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20635 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20637 {
20638 updateMask.SetBit(index);
20639
20640 if (index == UNIT_NPC_FLAGS)
20641 {
20642 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20643 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20644 }
20645 else if (index == UNIT_FIELD_AURASTATE)
20646 {
20647 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20648 fieldBuffer << uint32(0); // Fill in later.
20649 }
20650 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20651 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20652 {
20653 // convert from float to uint32 and send
20654 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20655 }
20656 // there are some float values which may be negative or can't get negative due to other checks
20657 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20660 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20661 {
20662 fieldBuffer << uint32(m_floatValues[index]);
20663 }
20664 // Gamemasters should be always able to select units - remove not selectable flag
20665 else if (index == UNIT_FIELD_FLAGS)
20666 {
20667 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20668 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20669 }
20670 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20671 else if (index == UNIT_FIELD_DISPLAYID)
20672 {
20673 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20674 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20675 }
20676 else if (index == UNIT_DYNAMIC_FLAGS)
20677 {
20678 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20680 fieldBuffer << dynamicFlags;
20681 }
20682 else if (index == UNIT_FIELD_BYTES_2)
20683 {
20684 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20685 fieldBuffer << m_uint32Values[index];
20686 }
20687 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20688 {
20689 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20690 fieldBuffer << m_uint32Values[index];
20691 }
20692 else
20693 {
20694 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20695 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20696
20697 // send in current format (float as float, uint32 as uint32)
20698 fieldBuffer << m_uint32Values[index];
20699 }
20700 }
20701 }
20702
20703 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20704 updateMask.AppendToPacket(&cacheValue.buffer);
20705 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20706 cacheValue.buffer.append(fieldBuffer);
20707 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20708
20709 int32 cachePos = static_cast<int32>(data->wpos());
20710 data->append(cacheValue.buffer);
20711
20712 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20713 if (cachePos)
20714 dataAdjustedPos.ApplyOffset(cachePos);
20715
20716 PatchValuesUpdate(*data, dataAdjustedPos, target);
20717
20718 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20719}
std::uint64_t uint64
Definition Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition SharedDefines.h:3375
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition SharedDefines.h:3374
@ UNIT_DYNFLAG_TAPPED
Definition SharedDefines.h:3373
@ SPELL_AURA_EMPATHY
Definition SpellAuraDefines.h:184
@ UPDATETYPE_VALUES
Definition UpdateData.h:28
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition UpdateFields.h:136
Definition ByteBuffer.h:70
void append(T value)
Definition ByteBuffer.h:129
std::size_t wpos() const
Definition ByteBuffer.h:330
uint16 _fieldNotifyFlags
Definition Object.h:268
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
UpdateMask _changesMask
Definition Object.h:264
uint32 * m_uint32Values
Definition Object.h:260
uint16 m_valuesCount
Definition Object.h:266
float * m_floatValues
Definition Object.h:261
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1881
ValuesUpdateCache _valuesUpdateCache
Definition Unit.h:2217
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:10692
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition Unit.cpp:5801
ObjectGuid GetOwnerGUID() const
Definition Unit.h:698
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition Unit.cpp:20721
Definition UpdateMask.h:25
uint32 GetBlockCount() const
Definition UpdateMask.h:62
bool GetBit(uint32 index) const
Definition UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:65
void SetBit(uint32 index)
Definition UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:49
Definition UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition UnitUtils.h:70
Definition UnitUtils.h:110

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2183{
2184 Unit* victim = dmgInfo.GetVictim();
2185 Unit* attacker = dmgInfo.GetAttacker();
2186 uint32 damage = dmgInfo.GetDamage();
2187 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2188 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2189
2190 if (!victim || !victim->IsAlive() || !damage)
2191 return;
2192
2193 // Magic damage, check for resists
2194 // Ignore spells that cant be resisted
2195 // Xinef: holy resistance exists for npcs
2196 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2197 {
2198 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2199
2200 float discreteResistProbability[11];
2201 for (uint32 i = 0; i < 11; ++i)
2202 {
2203 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2204 if (discreteResistProbability[i] < 0.0f)
2205 discreteResistProbability[i] = 0.0f;
2206 }
2207
2208 if (averageResist <= 0.1f)
2209 {
2210 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2211 discreteResistProbability[1] = 5.0f * averageResist;
2212 discreteResistProbability[2] = 2.5f * averageResist;
2213 }
2214
2215 float r = float(rand_norm());
2216 uint32 i = 0;
2217 float probabilitySum = discreteResistProbability[0];
2218
2219 while (r >= probabilitySum && i < 10)
2220 probabilitySum += discreteResistProbability[++i];
2221
2222 float damageResisted = float(damage * i / 10);
2223
2224 if (damageResisted) // if equal to 0, checking these is pointless
2225 {
2226 if (attacker)
2227 {
2229 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2230 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2231 AddPct(damageResisted, -(*j)->GetAmount());
2232
2234 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2235 if ((*j)->GetMiscValue() & schoolMask)
2236 AddPct(damageResisted, -(*j)->GetAmount());
2237 }
2238
2239 // pussywizard:
2240 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2241 {
2242 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2243 uint32 armorReduction = damage - damageAfterArmor;
2244 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2245 damageResisted = armorReduction;
2246 }
2247 }
2248
2249 dmgInfo.ResistDamage(uint32(damageResisted));
2250 }
2251
2252 // Ignore Absorption Auras
2253 float auraAbsorbMod = 0;
2254 if (attacker)
2255 {
2257 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2258 {
2259 if (!((*itr)->GetMiscValue() & schoolMask))
2260 continue;
2261
2262 if ((*itr)->GetAmount() > auraAbsorbMod)
2263 auraAbsorbMod = float((*itr)->GetAmount());
2264 }
2265
2267 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2268 {
2269 if (!((*itr)->GetMiscValue() & schoolMask))
2270 continue;
2271
2272 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2273 auraAbsorbMod = float((*itr)->GetAmount());
2274 }
2275 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2276 }
2277
2278 // We're going to call functions which can modify content of the list during iteration over it's elements
2279 // Let's copy the list so we can prevent iterator invalidation
2281 std::sort(vSchoolAbsorbCopy.begin(), vSchoolAbsorbCopy.end(), Acore::AbsorbAuraOrderPred());
2282
2283 // absorb without mana cost
2284 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2285 {
2286 AuraEffect* absorbAurEff = *itr;
2287 // Check if aura was removed during iteration - we don't need to work on such auras
2288 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2289 if (!aurApp)
2290 continue;
2291 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2292 continue;
2293
2294 // get amount which can be still absorbed by the aura
2295 int32 currentAbsorb = absorbAurEff->GetAmount();
2296 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2297 if (currentAbsorb < 0)
2298 currentAbsorb = 0;
2299
2300 uint32 tempAbsorb = uint32(currentAbsorb);
2301
2302 bool defaultPrevented = false;
2303
2304 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2305 currentAbsorb = tempAbsorb;
2306
2307 if (defaultPrevented)
2308 continue;
2309
2310 // absorb must be smaller than the damage itself
2311 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2312
2313 // xinef: do this after absorb is rounded to damage...
2314 AddPct(currentAbsorb, -auraAbsorbMod);
2315
2316 dmgInfo.AbsorbDamage(currentAbsorb);
2317
2318 tempAbsorb = currentAbsorb;
2319 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2320
2321 // Check if our aura is using amount to count damage
2322 if (absorbAurEff->GetAmount() >= 0)
2323 {
2324 // Reduce shield amount
2325 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2326 // Aura cannot absorb anything more - remove it
2327 if (absorbAurEff->GetAmount() <= 0)
2328 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2329 }
2330 }
2331
2332 // absorb by mana cost
2334 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2335 {
2336 AuraEffect* absorbAurEff = *itr;
2337 // Check if aura was removed during iteration - we don't need to work on such auras
2338 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2339 if (!aurApp)
2340 continue;
2341 // check damage school mask
2342 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2343 continue;
2344
2345 // get amount which can be still absorbed by the aura
2346 int32 currentAbsorb = absorbAurEff->GetAmount();
2347 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2348 if (currentAbsorb < 0)
2349 currentAbsorb = 0;
2350
2351 uint32 tempAbsorb = currentAbsorb;
2352
2353 bool defaultPrevented = false;
2354
2355 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2356 currentAbsorb = tempAbsorb;
2357
2358 if (defaultPrevented)
2359 continue;
2360
2361 // absorb must be smaller than the damage itself
2362 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2363
2364 // xinef: do this after absorb is rounded to damage...
2365 AddPct(currentAbsorb, -auraAbsorbMod);
2366
2367 int32 manaReduction = currentAbsorb;
2368
2369 // lower absorb amount by talents
2370 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2371 manaReduction = int32(float(manaReduction) * manaMultiplier);
2372
2373 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2374
2375 // take case when mana has ended up into account
2376 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2377
2378 dmgInfo.AbsorbDamage(currentAbsorb);
2379
2380 tempAbsorb = currentAbsorb;
2381 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2382
2383 // Check if our aura is using amount to count damage
2384 if (absorbAurEff->GetAmount() >= 0)
2385 {
2386 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2387 if ((absorbAurEff->GetAmount() <= 0))
2388 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2389 }
2390 }
2391
2392 // split damage auras - only when not damaging self
2393 // Xinef: not true - Warlock Hellfire
2394 if (/*victim != attacker &&*/ !Splited)
2395 {
2396 // We're going to call functions which can modify content of the list during iteration over it's elements
2397 // Let's copy the list so we can prevent iterator invalidation
2398 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2399 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2400 {
2401 // Check if aura was removed during iteration - we don't need to work on such auras
2402 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2403 continue;
2404 // check damage school mask
2405 if (!((*itr)->GetMiscValue() & schoolMask))
2406 continue;
2407
2408 // Damage can be splitted only if aura has an alive caster
2409 Unit* caster = (*itr)->GetCaster();
2410 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2411 continue;
2412
2413 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2414 // Ignore LOS attribute is only used for the cast portion of the spell
2415 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2416 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2417 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2418 continue;
2419
2420 int32 splitDamage = (*itr)->GetAmount();
2421
2422 // absorb must be smaller than the damage itself
2423 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2424
2425 dmgInfo.AbsorbDamage(splitDamage);
2426
2427 uint32 splitted = splitDamage;
2428 uint32 splitted_absorb = 0;
2429 uint32 splitted_resist = 0;
2430
2431 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2432 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2433 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2434 {
2435 procEx |= PROC_EX_IMMUNE;
2436 splittedDmgInfo.AbsorbDamage(splitted);
2437 }
2438 else
2439 {
2440 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2441 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2442 }
2443
2444 splitted_absorb = splittedDmgInfo.GetAbsorb();
2445 splitted_resist = splittedDmgInfo.GetResist();
2446 splitted = splittedDmgInfo.GetDamage();
2447
2448 // create procs
2449 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2450 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2451
2452 if (attacker)
2453 {
2454 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2455 }
2456
2457 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2458 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2459 }
2460
2461 // We're going to call functions which can modify content of the list during iteration over it's elements
2462 // Let's copy the list so we can prevent iterator invalidation
2464 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(); (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2465 {
2466 // Check if aura was removed during iteration - we don't need to work on such auras
2467 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2468 if (!aurApp)
2469 continue;
2470
2471 // check damage school mask
2472 if (!((*itr)->GetMiscValue() & schoolMask))
2473 continue;
2474
2475 // Damage can be splitted only if aura has an alive caster
2476 Unit* caster = (*itr)->GetCaster();
2477 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2478 continue;
2479
2480 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2481 // Ignore LOS attribute is only used for the cast portion of the spell
2482 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2483 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2484 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2485 continue;
2486
2487 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2488 SpellSchoolMask splitSchoolMask = schoolMask;
2489
2490 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2491
2492 // absorb must be smaller than the damage itself
2493 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2494
2495 // Roar of Sacrifice, dont absorb it
2496 if (splitSpellInfo->Id != 53480)
2497 dmgInfo.AbsorbDamage(splitDamage);
2498 else
2499 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2500
2501 uint32 splitted = splitDamage;
2502 uint32 splitted_absorb = 0;
2503 uint32 splitted_resist = 0;
2504
2505 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2506 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2507 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2508 {
2509 procEx |= PROC_EX_IMMUNE;
2510 splittedDmgInfo.AbsorbDamage(splitted);
2511 }
2512 else
2513 {
2514 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2515 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2516 }
2517
2518 splitted_absorb = splittedDmgInfo.GetAbsorb();
2519 splitted_resist = splittedDmgInfo.GetResist();
2520 splitted = splittedDmgInfo.GetDamage();
2521
2522 // create procs
2523 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2524 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2525
2526 if (attacker)
2527 {
2528 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2529 }
2530
2531 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2532 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2533 }
2534 }
2535}
double rand_norm()
Definition Random.cpp:85
@ POWER_MANA
Definition SharedDefines.h:280
@ SPELL_ATTR4_NO_CAST_LOG
Definition SharedDefines.h:541
SpellSchoolMask
Definition SharedDefines.h:306
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:308
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:311
@ SPELL_SCHOOL_MASK_HOLY
Definition SharedDefines.h:309
@ SPELL_AURA_MANA_SHIELD
Definition SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition SpellMgr.h:202
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition Unit.cpp:15931
@ DIRECT_DAMAGE
Definition Unit.h:250
@ MELEE_HIT_NORMAL
Definition Unit.h:288
T AddPct(T &base, U pct)
Definition Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition Util.h:79
Definition SpellAuraEffects.h:350
Definition SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition SpellAuraEffects.h:66
Unit * GetCaster() const
Definition SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition SpellAuraEffects.cpp:443
Aura * GetBase() const
Definition SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
void ResistDamage(uint32 amount)
Definition Unit.cpp:161
void AbsorbDamage(uint32 amount)
Definition Unit.cpp:154
Unit * GetVictim() const
Definition Unit.h:361
Unit * GetAttacker() const
Definition Unit.h:360
SpellInfo const * GetSpellInfo() const
Definition Unit.h:362
DamageEffectType GetDamageType() const
Definition Unit.h:364
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:363
uint32 GetDamage() const
Definition Unit.h:366
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2335
bool IsPositive() const
Definition SpellInfo.cpp:1237
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:14233
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1391
std::vector< AuraEffect * > AuraEffectList
Definition Unit.h:666
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition Unit.cpp:2066
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition Unit.cpp:2148
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:6409
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:16065
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12976
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2182
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:824
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1349
Definition Unit.h:317

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), DealDamage(), DealDamageShieldDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2067{
2068 float armor = float(victim->GetArmor());
2069
2070 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2071 if (attacker)
2072 {
2073 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2074
2075 if (spellInfo)
2076 if (Player* modOwner = attacker->GetSpellModOwner())
2077 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2078
2079 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2080 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2081 {
2082 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2083 && (*j)->IsAffectedOnSpell(spellInfo))
2084 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2085 }
2086
2087 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2088 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2089 {
2090 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2091 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2092 }
2093
2094 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2095 if (attacker->IsPlayer())
2096 {
2097 float bonusPct = 0;
2098 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2099 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2100 {
2101 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2102 {
2103 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2104 bonusPct += (*itr)->GetAmount();
2105 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2106 bonusPct += (*itr)->GetAmount();
2107 }
2108 else
2109 {
2110 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2111 bonusPct += (*itr)->GetAmount();
2112 }
2113 }
2114
2115 float maxArmorPen = 0;
2116 if (victim->GetLevel() < 60)
2117 maxArmorPen = float(400 + 85 * victim->GetLevel());
2118 else
2119 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2120
2121 // Cap armor penetration to this number
2122 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2123 // Figure out how much armor do we ignore
2124 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2125 // Got the value, apply it
2126 armor -= std::min(armorPen, maxArmorPen);
2127 }
2128 }
2129
2130 if (armor < 0.0f)
2131 armor = 0.0f;
2132
2133 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2134 if (levelModifier > 59)
2135 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2136
2137 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2138 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2139
2140 if (tmpvalue < 0.0f)
2141 tmpvalue = 0.0f;
2142 if (tmpvalue > 0.75f)
2143 tmpvalue = 0.75f;
2144
2145 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2146}
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition SpellDefines.h:89
@ CR_ARMOR_PENETRATION
Definition Unit.h:243

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2538{
2539 if (!healInfo.GetHeal())
2540 return;
2541
2542 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2543 int32 absorbAmount = 0;
2544
2545 // Need remove expired auras after
2546 bool existExpired = false;
2547
2548 // absorb without mana cost
2550 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2551 {
2552 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2553 continue;
2554
2555 // Max Amount can be absorbed by this aura
2556 int32 currentAbsorb = (*i)->GetAmount();
2557
2558 // Found empty aura (impossible but..)
2559 if (currentAbsorb <= 0)
2560 {
2561 existExpired = true;
2562 continue;
2563 }
2564
2565 // currentAbsorb - damage can be absorbed by shield
2566 // If need absorb less damage
2567 if (healing < currentAbsorb + absorbAmount)
2568 currentAbsorb = healing - absorbAmount;
2569
2570 absorbAmount += currentAbsorb;
2571
2572 // Reduce shield amount
2573 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2574 // Need remove it later
2575 if ((*i)->GetAmount() <= 0)
2576 existExpired = true;
2577 }
2578
2579 // Remove all expired absorb auras
2580 if (existExpired)
2581 {
2582 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2583 {
2584 AuraEffect* auraEff = *i;
2585 ++i;
2586 if (auraEff->GetAmount() <= 0)
2587 {
2588 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2590 if (healInfo.GetTarget()->m_removedAurasCount > removedAuras)
2591 i = vHealAbsorb.begin();
2592 }
2593 }
2594 }
2595
2596 if (absorbAmount > 0)
2597 healInfo.AbsorbHeal(absorbAmount);
2598}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition Unit.h:417
void AbsorbHeal(uint32 amount)
Definition Unit.h:392
Unit * GetTarget() const
Definition Unit.h:413
uint32 GetHeal() const
Definition Unit.h:414
uint32 SchoolMask
Definition SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14882{
14883 uint8 comboPoints = GetComboPoints();
14884
14885 int32 minduration = spellProto->GetDuration();
14886 int32 maxduration = spellProto->GetMaxDuration();
14887
14888 int32 duration;
14889
14890 if (comboPoints && minduration != -1 && minduration != maxduration)
14891 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14892 else
14893 duration = minduration;
14894
14895 return duration;
14896}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition Unit.h:992

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
bool  npcCaster 
) const
20156{
20157 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20158 if (npcCaster)
20160
20161 return damage;
20162}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6073

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
3022{
3023 float minDamage = 0.0f;
3024 float maxDamage = 0.0f;
3025
3026 if (normalized || !addTotalPct || itemDamagesMask)
3027 {
3028 // get both by default
3029 if (!itemDamagesMask)
3030 {
3031 itemDamagesMask = (1 << 0) | (1 << 1);
3032 }
3033
3034 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3035 {
3036 if (itemDamagesMask & (1 << i))
3037 {
3038 float minTmp, maxTmp;
3039 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3040 minDamage += minTmp;
3041 maxDamage += maxTmp;
3042 }
3043 }
3044 }
3045 else
3046 {
3047 switch (attType)
3048 {
3049 case RANGED_ATTACK:
3052 break;
3053 case BASE_ATTACK:
3056 break;
3057 case OFF_ATTACK:
3060 break;
3061 default:
3062 break;
3063 }
3064 }
3065
3066 minDamage = std::max(0.f, minDamage);
3067 maxDamage = std::max(0.f, maxDamage);
3068
3069 if (minDamage > maxDamage)
3070 {
3071 std::swap(minDamage, maxDamage);
3072 }
3073
3074 return urand(uint32(minDamage), uint32(maxDamage));
3075}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17219{
17220 // Damage over Time spells bonus calculation
17221 float DotFactor = 1.0f;
17222 if (damagetype == DOT)
17223 {
17224 int32 DotDuration = spellInfo->GetDuration();
17225 if (!spellInfo->IsChanneled() && DotDuration > 0)
17226 DotFactor = DotDuration / 15000.0f;
17227
17228 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17229 DotFactor /= DotTicks;
17230 }
17231
17232 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17233 // Distribute Damage over multiple effects, reduce by AoE
17234 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17235
17236 // As wowwiki says: C = (Cast Time / 3.5)
17237 return (CastingTime / 3500.0f) * DotFactor;
17238}
@ DOT
Definition Unit.h:252
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition Unit.cpp:17100

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken(), and SpellHealingBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3078{
3079 if (!IsPlayer())
3080 return 1.0f;
3081
3082 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3083 return 1.0f;
3084
3085 float LvlPenalty = 0.0f;
3086
3087 // xinef: added brackets
3088 if (spellProto->SpellLevel < 20)
3089 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3090
3091 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3092 if (LvlFactor > 1.0f)
3093 LvlFactor = 1.0f;
3094
3095 return AddPct(LvlFactor, -LvlPenalty);
3096}
uint8 GetLevel() const
Definition Unit.h:1065

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), and SpellHealingBonusTaken().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1497{
1498 damageInfo->attacker = this;
1499 damageInfo->target = victim;
1500
1501 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1502 {
1503 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1504 damageInfo->damages[i].damage = 0;
1505 damageInfo->damages[i].absorb = 0;
1506 damageInfo->damages[i].resist = 0;
1507 }
1508
1509 damageInfo->attackType = attackType;
1510 damageInfo->cleanDamage = 0;
1511 damageInfo->blocked_amount = 0;
1512
1513 damageInfo->TargetState = 0;
1514 damageInfo->HitInfo = 0;
1515 damageInfo->procAttacker = PROC_FLAG_NONE;
1516 damageInfo->procVictim = PROC_FLAG_NONE;
1517 damageInfo->procEx = PROC_EX_NONE;
1518 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1519
1520 if (!victim)
1521 return;
1522
1523 if (!IsAlive() || !victim->IsAlive())
1524 return;
1525
1526 // Select HitInfo/procAttacker/procVictim flag based on attack type
1527 switch (attackType)
1528 {
1529 case BASE_ATTACK:
1532 break;
1533 case OFF_ATTACK:
1536 damageInfo->HitInfo = HITINFO_OFFHAND;
1537 break;
1538 default:
1539 return;
1540 }
1541
1542 // School Immune check
1543 uint8 immunedMask = 0;
1544 bool hasNonPhysicalSchoolMask = false;
1545 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1546 {
1548 {
1549 immunedMask |= (1 << i);
1551 {
1552 hasNonPhysicalSchoolMask = true;
1553 }
1554 }
1555 }
1556
1557 // School Immune check
1558 if (immunedMask & ((1 << 0) | (1 << 1)))
1559 {
1560 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1561 {
1562 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1563 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1564
1565 damageInfo->procEx |= PROC_EX_IMMUNE;
1566 return;
1567 }
1568 }
1569
1570 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1571 {
1572 // only players have secondary weapon damage
1573 if (i > 0 && !IsPlayer())
1574 {
1575 break;
1576 }
1577
1578 if (immunedMask & (1 << i))
1579 {
1580 continue;
1581 }
1582
1583 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1584 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1585
1586 uint32 damage = 0;
1587 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1588
1589 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1590 // Add melee damage bonus
1591 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1592 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1593
1594 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1595 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1596
1597 if (victim->GetAI())
1598 {
1599 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1600 }
1601
1602 // Calculate armor reduction
1604 {
1605 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1606 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1607 }
1608 else
1609 {
1610 damageInfo->damages[i].damage = damage;
1611 }
1612 }
1613
1614 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1615
1616 // If the victim was a sitting player and we didn't roll a miss, then crit.
1617 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1618 {
1619 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1620 }
1621 switch (damageInfo->hitOutCome)
1622 {
1623 case MELEE_HIT_EVADE:
1625 damageInfo->TargetState = VICTIMSTATE_EVADES;
1626 damageInfo->procEx |= PROC_EX_EVADE;
1627
1628 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1629 {
1630 damageInfo->damages[i].damage = 0;
1631 }
1632
1633 damageInfo->cleanDamage = 0;
1634 return;
1635 case MELEE_HIT_MISS:
1636 damageInfo->HitInfo |= HITINFO_MISS;
1637 damageInfo->TargetState = VICTIMSTATE_INTACT;
1638 damageInfo->procEx |= PROC_EX_MISS;
1639
1640 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1641 {
1642 damageInfo->damages[i].damage = 0;
1643 }
1644 damageInfo->cleanDamage = 0;
1645 break;
1646 case MELEE_HIT_NORMAL:
1647 damageInfo->TargetState = VICTIMSTATE_HIT;
1648 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1649 break;
1650 case MELEE_HIT_CRIT:
1651 {
1652 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1653 damageInfo->TargetState = VICTIMSTATE_HIT;
1654
1655 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1656 // Crit bonus calc
1657 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1658 {
1659 damageInfo->damages[i].damage *= 2;
1660
1661 float mod = 0.0f;
1662 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1663 if (damageInfo->attackType == RANGED_ATTACK)
1664 {
1666 }
1667 else
1668 {
1670
1671 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1673 }
1674
1675 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1676
1677 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1679 if (mod != 0)
1680 {
1681 AddPct(damageInfo->damages[i].damage, mod);
1682 }
1683 }
1684 break;
1685 }
1686 case MELEE_HIT_PARRY:
1687 damageInfo->TargetState = VICTIMSTATE_PARRY;
1688 damageInfo->procEx |= PROC_EX_PARRY;
1689 damageInfo->cleanDamage = 0;
1690
1691 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1692 {
1693 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1694 damageInfo->damages[i].damage = 0;
1695 }
1696 break;
1697 case MELEE_HIT_DODGE:
1698 damageInfo->TargetState = VICTIMSTATE_DODGE;
1699 damageInfo->procEx |= PROC_EX_DODGE;
1700 damageInfo->cleanDamage = 0;
1701
1702 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1703 {
1704 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1705 damageInfo->damages[i].damage = 0;
1706 }
1707 break;
1708 case MELEE_HIT_BLOCK:
1709 {
1710 damageInfo->TargetState = VICTIMSTATE_HIT;
1711 damageInfo->HitInfo |= HITINFO_BLOCK;
1712 damageInfo->procEx |= PROC_EX_BLOCK;
1713 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1714 // double blocked amount if block is critical
1715 if (damageInfo->target->isBlockCritical())
1716 damageInfo->blocked_amount += damageInfo->blocked_amount;
1717
1718 uint32 remainingBlock = damageInfo->blocked_amount;
1719 uint8 fullBlockMask = 0;
1720 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1721 {
1722 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1723 {
1724 fullBlockMask |= (1 << i);
1725
1726 remainingBlock -= damageInfo->damages[i].damage;
1727 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1728 damageInfo->damages[i].damage = 0;
1729 }
1730 else
1731 {
1732 damageInfo->cleanDamage += remainingBlock;
1733 damageInfo->damages[i].damage -= remainingBlock;
1734 remainingBlock = 0;
1735 }
1736 }
1737
1738 // full block
1739 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1740 {
1741 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1742 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1743 damageInfo->blocked_amount -= remainingBlock;
1744 }
1745 break;
1746 }
1747 case MELEE_HIT_GLANCING:
1748 {
1749 damageInfo->HitInfo |= HITINFO_GLANCING;
1750 damageInfo->TargetState = VICTIMSTATE_HIT;
1751 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1752 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1753 if (leveldif > 3)
1754 leveldif = 3;
1755 float reducePercent = 1 - leveldif * 0.1f;
1756
1757 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1758 {
1759 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1760 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1761 damageInfo->damages[i].damage = reducedDamage;
1762 }
1763 break;
1764 }
1765 case MELEE_HIT_CRUSHING:
1766 damageInfo->HitInfo |= HITINFO_CRUSHING;
1767 damageInfo->TargetState = VICTIMSTATE_HIT;
1768 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1769
1770 // 150% normal damage
1771 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1772 {
1773 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1774 }
1775 break;
1776 default:
1777 break;
1778 }
1779
1780 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1781 if (!(damageInfo->HitInfo & HITINFO_MISS))
1782 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1783
1784 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1785
1786 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1787 {
1788 int32 dmg = damageInfo->damages[i].damage;
1789 int32 cleanDamage = damageInfo->cleanDamage;
1790 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1791 if (CanApplyResilience())
1792 {
1793 int32 resilienceReduction = damageInfo->damages[i].damage;
1794 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1795
1796 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1797 dmg -= resilienceReduction;
1798 cleanDamage += resilienceReduction;
1799 }
1800
1801 damageInfo->damages[i].damage = std::max(0, dmg);
1802 damageInfo->cleanDamage = std::max(0, cleanDamage);
1803
1804 // Calculate absorb resist
1805 if (damageInfo->damages[i].damage > 0)
1806 {
1807 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1808
1809 // Calculate absorb & resists
1810 DamageInfo dmgInfo(*damageInfo, i);
1811 Unit::CalcAbsorbResist(dmgInfo);
1812 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1813 damageInfo->damages[i].resist = dmgInfo.GetResist();
1814
1815 if (damageInfo->damages[i].absorb)
1816 {
1817 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1818 }
1819
1820 if (damageInfo->damages[i].resist)
1821 {
1822 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1823 }
1824
1825 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1826 }
1827 }
1828
1829 // set proper HitInfo flags
1830 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1831 {
1832 // set partial absorb when secondary damage isn't full absorbed
1833 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1834 }
1835 else
1836 {
1837 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1838 }
1839
1840 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1841 {
1842 // set partial resist when secondary damage isn't full resisted
1843 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1844 }
1845 else
1846 {
1847 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1848 }
1849
1851 {
1852 damageInfo->procEx |= PROC_EX_ABSORB;
1853 }
1854
1855 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1856 {
1857 damageInfo->procEx |= PROC_EX_RESIST;
1858 }
1859}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition SpellMgr.h:193
@ PROC_EX_DODGE
Definition SpellMgr.h:198
@ PROC_EX_BLOCK
Definition SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition SpellMgr.h:195
@ PROC_EX_MISS
Definition SpellMgr.h:196
@ PROC_EX_RESIST
Definition SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition SpellMgr.h:207
@ PROC_EX_ABSORB
Definition SpellMgr.h:204
@ PROC_EX_PARRY
Definition SpellMgr.h:199
@ PROC_EX_EVADE
Definition SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition SpellMgr.h:141
@ PROC_FLAG_NONE
Definition SpellMgr.h:105
@ VICTIMSTATE_INTACT
Definition Unit.h:85
@ VICTIMSTATE_HIT
Definition Unit.h:86
@ VICTIMSTATE_DODGE
Definition Unit.h:87
@ VICTIMSTATE_IS_IMMUNE
Definition Unit.h:92
@ VICTIMSTATE_PARRY
Definition Unit.h:88
@ VICTIMSTATE_BLOCKS
Definition Unit.h:90
@ VICTIMSTATE_EVADES
Definition Unit.h:91
@ HITINFO_PARTIAL_ABSORB
Definition Unit.h:105
@ HITINFO_FULL_RESIST
Definition Unit.h:106
@ HITINFO_NORMALSWING
Definition Unit.h:98
@ HITINFO_BLOCK
Definition Unit.h:112
@ HITINFO_CRUSHING
Definition Unit.h:116
@ HITINFO_SWINGNOHITSOUND
Definition Unit.h:120
@ HITINFO_MISS
Definition Unit.h:103
@ HITINFO_FULL_ABSORB
Definition Unit.h:104
@ HITINFO_OFFHAND
Definition Unit.h:101
@ HITINFO_GLANCING
Definition Unit.h:115
@ HITINFO_CRITICALHIT
Definition Unit.h:108
@ HITINFO_PARTIAL_RESIST
Definition Unit.h:107
@ HITINFO_AFFECTS_VICTIM
Definition Unit.h:100
@ MELEE_HIT_CRUSHING
Definition Unit.h:288
@ MELEE_HIT_BLOCK
Definition Unit.h:287
@ MELEE_HIT_CRIT
Definition Unit.h:288
@ MELEE_HIT_EVADE
Definition Unit.h:287
@ MELEE_HIT_DODGE
Definition Unit.h:287
@ MELEE_HIT_MISS
Definition Unit.h:287
@ MELEE_HIT_PARRY
Definition Unit.h:287
@ MELEE_HIT_GLANCING
Definition Unit.h:288
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition UnitAI.h:380
bool isBlockCritical()
Definition Unit.cpp:3163
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13351
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6060
bool CanApplyResilience() const
Definition Unit.h:1134
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition Unit.cpp:3021
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition Unit.cpp:18954
UnitAI * GetAI()
Definition Unit.h:678
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition Unit.cpp:2043
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:6009
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition Unit.cpp:2820
uint32 GetCreatureTypeMask() const
Definition Unit.h:811
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13149
uint32 damageSchoolMask
Definition Unit.h:471
uint32 blocked_amount
Definition Unit.h:477
MeleeHitOutcome hitOutCome
Definition Unit.h:486
uint32 cleanDamage
Definition Unit.h:485
uint32 TargetState
Definition Unit.h:479
uint32 resist
Definition Unit.h:474

References CalcDamageInfo::absorb, AddPct(), ApplyResilience(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculateDamage(), CanApplyResilience(), CalcDamageInfo::cleanDamage, CR_CRIT_TAKEN_MELEE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), GetLevel(), GetMeleeDamageSchoolMask(), DamageInfo::GetResist(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_DAMAGE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1328{
1329 if (damage < 0)
1330 return;
1331
1332 Unit* victim = damageInfo->target;
1333 if (!victim || !victim->IsAlive())
1334 return;
1335
1336 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1337 uint32 crTypeMask = victim->GetCreatureTypeMask();
1338
1339 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1340 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1341
1342 if (victim->GetAI())
1343 {
1344 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1345 }
1346
1347 int32 cleanDamage = 0;
1348 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1349 {
1350 int32 oldDamage = damage;
1351 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1352 cleanDamage = oldDamage - damage;
1353 }
1354
1355 bool blocked = false;
1356 // Per-school calc
1357 switch (spellInfo->DmgClass)
1358 {
1359 // Melee and Ranged Spells
1362 {
1363 // Physical Damage
1364 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1365 {
1366 // Get blocked status
1367 blocked = isSpellBlocked(victim, spellInfo, attackType);
1368 }
1369
1370 if (crit)
1371 {
1372 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1373
1374 // Calculate crit bonus
1375 uint32 crit_bonus = damage;
1376 // Apply crit_damage bonus for melee spells
1377 if (Player* modOwner = GetSpellModOwner())
1378 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1379 damage += crit_bonus;
1380
1381 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1382 float critPctDamageMod = 0.0f;
1383 if (attackType == RANGED_ATTACK)
1385 else
1387
1388 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1389 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1390
1391 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1393
1394 if (critPctDamageMod != 0)
1395 AddPct(damage, critPctDamageMod);
1396 }
1397
1398 // Spell weapon based damage CAN BE crit & blocked at same time
1399 if (blocked)
1400 {
1401 damageInfo->blocked = victim->GetShieldBlockValue();
1402 // double blocked amount if block is critical
1403 if (victim->isBlockCritical())
1404 damageInfo->blocked *= 2;
1405 if (damage < int32(damageInfo->blocked))
1406 damageInfo->blocked = uint32(damage);
1407
1408 damage -= damageInfo->blocked;
1409 cleanDamage += damageInfo->blocked;
1410 }
1411
1412 int32 resilienceReduction = damage;
1413 if (CanApplyResilience())
1414 {
1415 if (attackType != RANGED_ATTACK)
1416 {
1417 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1418 }
1419 else
1420 {
1421 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1422 }
1423 }
1424
1425 resilienceReduction = damage - resilienceReduction;
1426 damage -= resilienceReduction;
1427 cleanDamage += resilienceReduction;
1428 break;
1429 }
1430 // Magical Attacks
1433 {
1434 // If crit add critical bonus
1435 if (crit)
1436 {
1437 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1438 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1439 }
1440
1441 int32 resilienceReduction = damage;
1442 if (CanApplyResilience())
1443 {
1444 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1445 }
1446
1447 resilienceReduction = damage - resilienceReduction;
1448 damage -= resilienceReduction;
1449 cleanDamage += resilienceReduction;
1450 break;
1451 }
1452 default:
1453 break;
1454 }
1455
1456 damageInfo->cleanDamage = std::max(0, cleanDamage);
1457 damageInfo->damage = std::max(0, damage);
1458
1459 // Calculate absorb resist
1460 if (damageInfo->damage > 0)
1461 {
1462 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1463 Unit::CalcAbsorbResist(dmgInfo);
1464 damageInfo->absorb = dmgInfo.GetAbsorb();
1465 damageInfo->resist = dmgInfo.GetResist();
1466 damageInfo->damage = dmgInfo.GetDamage();
1467 }
1468}
@ SPELL_DAMAGE_CLASS_RANGED
Definition SharedDefines.h:1559
@ SPELL_DAMAGE_CLASS_MAGIC
Definition SharedDefines.h:1557
@ SPELL_DAMAGE_CLASS_NONE
Definition SharedDefines.h:1556
@ SPELL_DAMAGE_CLASS_MELEE
Definition SharedDefines.h:1558
@ SPELL_HIT_TYPE_CRIT
Definition SharedDefines.h:1547
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:251
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition UnitAI.h:381
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition Unit.cpp:3137
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition Unit.cpp:12355
Unit * target
Definition Unit.h:497
uint32 HitInfo
Definition Unit.h:508
uint32 damage
Definition Unit.h:500
uint32 absorb
Definition Unit.h:503
Unit * attacker
Definition Unit.h:498
uint32 schoolMask
Definition Unit.h:502
uint32 cleanDamage
Definition Unit.h:510
uint32 resist
Definition Unit.h:504
uint32 blocked
Definition Unit.h:507

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1679 {
1682 }
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14640{
14641 // only creatures can have threat list
14642 if (!IsCreature())
14643 return false;
14644
14645 // only alive units can have threat list
14646 if (!skipAliveCheck && !IsAlive())
14647 return false;
14648
14649 // totems can not have threat list
14650 if (ToCreature()->IsTotem())
14651 return false;
14652
14653 // vehicles can not have threat list
14654 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14655 return false;
14656
14657 // summons can not have a threat list, unless they are controlled by a creature
14659 return false;
14660
14661 return true;
14662}
@ UNIT_MASK_CONTROLLABLE_GUARDIAN
Definition UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
bool IsVehicle() const
Definition Unit.h:783
Map * GetMap() const
Definition Object.h:621

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1546{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1516{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21111{
21112 // Aura of Despair exceptions
21113 switch (spellInfo->Id)
21114 {
21115 case 16666: // Demonic Rune
21116 case 27869: // Dark Rune
21117 case 30824: // Shamanistic Rage
21118 case 31786: // Spiritual Attunement
21119 case 31930: // Judgements of the Wise
21120 case 34075: // Aspect of the Viper
21121 case 34720: // Thrill of the hunt
21122 case 47755: // Rapture
21123 case 54425: // Improved Felhunter
21124 case 57319: // Blessing of Sanctuary
21125 case 63337: // Saronite Vapors (regenerate mana)
21126 case 63375: // Improved stormstrike
21127 case 64372: // Lifebloom
21128 case 68285: // Improved Leader of the Pack
21129 return true;
21130 case 54428: // Divine Plea - only with talent Guarded by the Light
21131 return HasSpell(53583);
21132 default:
21133 break;
21134 }
21135
21136 return false;
21137}
virtual bool HasSpell(uint32) const
Definition Unit.h:1541

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3996{
3998 return false;
3999
4000 if (!attacker)
4001 return false;
4002
4003 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
4004 return false;
4005
4006 if (Creature const* creature = ToCreature())
4007 if (!creature->GetSparringPct())
4008 return false;
4009
4010 return true;
4011}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition Unit.h:1276

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19727{
19728 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19730 return false;
19732 return true;
19734 return false;
19736 return true;
19738}
@ UNIT_FLAG2_UNUSED_6
Definition UnitDefines.h:311
@ UNIT_FLAG_CANNOT_SWIM
Definition UnitDefines.h:268
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:278
@ UNIT_FLAG_SWIMMING
Definition UnitDefines.h:269
@ UNIT_FLAG_RENAME
Definition UnitDefines.h:258
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:265
bool HasUnitFlag2(UnitFlags2 flags) const
Definition Unit.h:738

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by PathGenerator::BuildPolyPath(), and Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/5]

SpellCastResult Unit::CastCustomSpell ( SpellInfo const *  spellInfo,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1290{
1291 SpellCastTargets targets;
1292 targets.SetUnitTarget(victim);
1293
1294 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1295}
Definition Spell.h:119
void SetUnitTarget(Unit *target)
Definition Spell.cpp:239

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastCustomSpell() [2/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1278{
1279 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1280 if (!spellInfo)
1281 {
1282 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1284 }
1285
1286 return CastCustomSpell(spellInfo, value, victim, triggerFlags, castItem, triggeredByAura, originalCaster);
1287}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition SharedDefines.h:1067
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1251

References CastCustomSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [3/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1264{
1265 CustomSpellValues values;
1266 values.AddSpellMod(mod, value);
1267 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1268}
@ TRIGGERED_NONE
Definition SpellDefines.h:133
Definition SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition SpellDefines.h:167

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [4/5]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1271{
1272 CustomSpellValues values;
1273 values.AddSpellMod(mod, value);
1274 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1275}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [5/5]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1252{
1253 CustomSpellValues values;
1254 if (bp0)
1255 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1256 if (bp1)
1257 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1258 if (bp2)
1259 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1260 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1261}
@ SPELLVALUE_BASE_POINT1
Definition SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_krik_thir::boss_krik_thirAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_soul_deflection::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), SmartScript::ProcessAction(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20068{
20069 AuraEffect* aurEff = nullptr;
20070 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20071 {
20072 aurEff = *i;
20073 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20074 continue;
20075
20076 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20077 break;
20078 }
20079
20080 // xinef: delay only for casting on different unit
20081 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20082 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20083 else
20084 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20085}
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition WorldConfig.h:143
uint32 GetTickNumber() const
Definition SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition SpellAuraEffects.h:117
uint32 GetId() const
Definition SpellAuraEffects.cpp:433
int32 GetTotalTicks() const
Definition SpellAuraEffects.cpp:7383
ObjectGuid GetCasterGUID() const
Definition SpellAuraEffects.h:48
Definition Unit.cpp:20034
uint64 CalculateQueueTime(uint64 delay) const
Definition EventProcessor.cpp:164
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true, uint8 eventGroup=0)
Definition EventProcessor.cpp:136

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17344{
17345 uint32 auraId = aura->GetAura(GetEntry());
17346 if (!auraId)
17347 return;
17348
17349 if (auraId == 35696) // Demonic Knowledge
17350 {
17351 int32 basePoints = aura->GetDamage();
17352 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17353 }
17354 else
17355 CastSpell(this, auraId, true);
17356}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1298{
1299 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1300 if (!spellInfo)
1301 {
1302 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1304 }
1305
1306 SpellCastTargets targets;
1307 targets.SetDst(x, y, z, GetOrientation());
1308
1309 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1310}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition Spell.cpp:406

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1313{
1314 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1315 if (!spellInfo)
1316 {
1317 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1319 }
1320
1321 SpellCastTargets targets;
1322 targets.SetGOTarget(go);
1323
1324 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1325}
void SetGOTarget(GameObject *target)
Definition Spell.cpp:271

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1195{
1196 if (!spellInfo)
1197 {
1198 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1200 }
1201
1203 if (!originalCaster && triggeredByAura)
1204 {
1205 originalCaster = triggeredByAura->GetCasterGUID();
1206 }
1207
1208 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1209
1210 if (value)
1211 {
1212 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1213 {
1214 spell->SetSpellValue(itr->first, itr->second);
1215 }
1216 }
1217
1218 spell->m_CastItem = castItem;
1219 return spell->prepare(&targets, triggeredByAura);
1220}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8387
Item * m_CastItem
Definition Spell.h:532

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), Player::ApplyItemObtainSpells(), spell_hun_lock_and_load::ApplyMarker(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), CastSpell(), CastSpell(), GameObject::CastSpell(), CastSpell(), CastSpell(), CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::DoAction(), npc_molten_golem::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_braziers_hit::HandleAfterEffectApply(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_mirkblood_dash_gash_return_to_tank_pre_spell::HandleCast(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_magtheridon_quake::HandleHit(), spell_chapter5_return_to_capital::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_karazhan_wrath_titans_aura::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_summon_amanishi_sentries::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_azjol_drain_power::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_dragonblight_devour_ghoul::HandleScriptEffect(), spell_hawk_hunting::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), npc_jenny::Initialize(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), npc_necropolis_health::JustDied(), npc_necrotic_shard::JustDied(), CombatAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_pallid_horror::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_q12937_relief_for_the_fallen::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_cultist_engineer::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_necropolis_relay::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_necropolis_proxy::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), boss_felmyst::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_item_brewfest_hops::Update(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_loken::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1240{
1241 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1242}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1245{
1246 SpellCastTargets targets;
1247 targets.SetUnitTarget(victim);
1248 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1249}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1223{
1224 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1225}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1228{
1229 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1230 if (!spellInfo)
1231 {
1232 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1234 }
1235
1236 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1237}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19475{
19476 if (!m_vehicle)
19477 return;
19478
19479 if (seatId < 0)
19480 {
19481 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19482 if (seatId < 0)
19483 return;
19484 }
19485 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19486 return;
19487
19489 if (!m_vehicle->AddPassenger(this, seatId))
19490 ABORT();
19491}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition Vehicle.cpp:246
bool HasEmptySeat(int8 seatId) const
Definition Vehicle.cpp:220

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15754{
15756 return;
15757
15758 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15760
15761 if (IsInWorld()) // not in world and not being removed atm
15763
15764 ASSERT(GetGUID());
15765
15766 // A unit may be in removelist and not in world, but it is still in grid
15767 // and may have some references during delete
15770
15771 if (finalCleanup)
15772 m_cleanupDone = true;
15773
15774 CombatStop();
15779 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15780}
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void Clear(bool reset=true)
Definition MotionMaster.h:182
void ClearAllThreat()
Definition ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10512
void RemoveAllGameObjects()
Definition Unit.cpp:6362
void ClearComboPoints()
Definition Unit.cpp:16886
void ClearComboPointHolders()
Definition Unit.cpp:16941
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:940
void RemoveFromWorld() override
Definition Unit.cpp:15707
void RemoveAllAuras()
Definition Unit.cpp:5387
ThreatMgr & GetThreatMgr()
Definition Unit.h:936

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), m_cleanupDone, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15783{
15784 if (GetTransport())
15785 {
15787 SetTransport(nullptr);
15790 }
15791
15792 CleanupBeforeRemoveFromMap(finalCleanup);
15793}
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition Unit.cpp:15753
void SetTransport(Transport *t)
Definition Object.h:691
void Reset()
Definition Object.h:299
void RemoveMovementFlag(uint32 flag)
Definition Object.h:345

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
16950{
16951 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16952 m_reactiveTimer[i] = 0;
16953
16960}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition SharedDefines.h:1303
@ AURA_STATE_HUNTER_PARRY
Definition SharedDefines.h:1309
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition UnitDefines.h:239
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition Unit.h:827
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10623

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
16942{
16943 while (!m_ComboPointHolders.empty())
16944 {
16945 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
16946 }
16947}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16887{
16888 if (!m_comboTarget)
16889 {
16890 return;
16891 }
16892
16893 // remove Premed-like effects
16894 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16896
16897 m_comboPoints = 0;
16900 m_comboTarget = nullptr;
16901}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1817{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition Unit.h:743

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13894{
13895 m_CombatTimer = 0;
13897
13898 // Player's state will be cleared in Player::UpdateContestedPvP
13899 if (Creature* creature = ToCreature())
13900 {
13901 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13902 SetImmuneToPC(true); // set immunity state to the one from db on evade
13903
13906 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13907
13908 creature->SetAssistanceTimer(0);
13909
13910 // Xinef: will be recalculated at follow movement generator initialization
13911 if (!IsPet() && !IsCharmed())
13912 return;
13913 }
13914 else if (Player* player = ToPlayer())
13915 {
13916 player->UpdatePotionCooldown();
13917 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13918 for (uint8 i = 0; i < MAX_RUNES; ++i)
13919 player->SetGracePeriod(i, 0);
13920 }
13921
13922 if (Player* player = this->ToPlayer())
13923 {
13924 sScriptMgr->OnPlayerLeaveCombat(player);
13925 }
13926}
#define MAX_RUNES
Definition Player.h:394
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:238
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:273
@ UNIT_FLAG_IMMUNE_TO_PC
Definition UnitDefines.h:262
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:754
bool IsCharmed() const
Definition Unit.h:1277
bool IsPet() const
Definition Unit.h:780
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13685
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:734

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
722{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SmartAI::SetCombatMovement(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), SetRooted(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13704{
13705 // Xinef: Dont allow to start combat with triggers
13706 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13707 return;
13708
13709 if (initialAggro)
13710 {
13711 // Make player victim stand up automatically
13712 if (victim->getStandState() && victim->IsPlayer())
13713 {
13714 victim->SetStandState(UNIT_STAND_STATE_STAND);
13715 }
13716
13717 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13718 {
13719 if (victim->IsPet())
13720 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13721 else
13722 {
13723 victim->ToCreature()->AI()->AttackStart(this);
13724 // if the target is an NPC with a pet or minion, pet should react.
13725 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13726 {
13727 victimControlledUnit->SetInCombatWith(this);
13728 SetInCombatWith(victimControlledUnit);
13729 victimControlledUnit->AddThreat(this, 0.0f);
13730 }
13731 }
13732
13733 // if unit has an owner, put owner in combat.
13734 if (Unit* victimOwner = victim->GetOwner())
13735 {
13736 if (!(victimOwner->IsInCombatWith(this)))
13737 {
13738 /* warding off to not take over aggro for no reason
13739 Using only AddThreat causes delay in attack */
13740 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13741 {
13742 victimOwner->ToCreature()->AI()->AttackStart(this);
13743 }
13744 victimOwner->SetInCombatWith(this);
13745 SetInCombatWith(victimOwner);
13746 victimOwner->AddThreat(this, 0.0f);
13747 }
13748 }
13749 }
13750
13751 bool alreadyInCombat = IsInCombat();
13752
13753 SetInCombatWith(victim);
13754 victim->SetInCombatWith(this);
13755
13756 // Update leash timer when attacking creatures
13757 if (victim->IsCreature() && this != victim)
13758 victim->ToCreature()->UpdateLeashExtensionTime();
13759
13760 // Xinef: If pet started combat - put owner in combat
13761 if (!alreadyInCombat && IsInCombat())
13762 {
13763 if (Unit* owner = GetOwner())
13764 {
13765 owner->SetInCombatWith(victim);
13766 victim->SetInCombatWith(owner);
13767 }
13768 }
13769 }
13770
13771 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13772 if (who->IsPlayer())
13773 SetContestedPvP(who->ToPlayer());
13774
13776 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13777 {
13778 player->UpdatePvP(true);
13780 }
13781}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:32
@ REACT_PASSIVE
Definition Unit.h:550
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1526
Unit * GetCharmerOrOwnerOrSelf() const
Definition Unit.h:1254
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition Unit.cpp:17270
Unit * GetFirstControlled() const
Definition Unit.cpp:11151

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13784{
13785 // Xinef: Dont allow to start combat with triggers
13786 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13787 return;
13788
13789 if (initialAggro)
13790 {
13791 SetInCombatWith(target, duration);
13792
13793 // Xinef: If pet started combat - put owner in combat
13794 if (Unit* owner = GetOwner())
13795 owner->SetInCombatWith(target, duration);
13796
13797 // Update leash timer when attacking creatures
13798 if (target->IsCreature())
13800 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13802 }
13803
13804 Unit* who = target->GetCharmerOrOwnerOrSelf();
13805 if (who->IsPlayer())
13806 SetContestedPvP(who->ToPlayer());
13807
13809 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13810 {
13811 player->UpdatePvP(true);
13813 }
13814}
bool IsTrigger() const
Definition Creature.h:80

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10513{
10514 if (includingCast && IsNonMeleeSpellCast(false))
10516
10517 AttackStop();
10519 if (IsPlayer())
10520 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10521 if (Creature* pCreature = ToCreature())
10522 pCreature->ClearLastLeashExtensionTimePtr();
10523 ClearInCombat();
10524
10525 // xinef: just in case
10526 if (IsPetInCombat() && !IsPlayer())
10528}
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition Unit.h:920
void ClearInPetCombat()
Definition Unit.cpp:13928
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition Unit.cpp:10560
void ClearInCombat()
Definition Unit.cpp:13893
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10479

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10531{
10532 CombatStop(includingCast);
10533
10534 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10535 (*itr)->CombatStop(includingCast);
10536}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1084{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition Unit.h:1070

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1083{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition Unit.h:1071

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17374{
17375 if (!IsPlayer())
17376 return nullptr;
17377
17378 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17379
17380 if (!pet->CreateBaseAtCreature(creatureTarget))
17381 {
17382 delete pet;
17383 return nullptr;
17384 }
17385
17386 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17387
17388 if (!InitTamedPet(pet, level, spell_id))
17389 {
17390 delete pet;
17391 return nullptr;
17392 }
17393
17394 return pet;
17395}
@ HUNTER_PET
Definition PetDefines.h:33
bool CreateBaseAtCreature(Creature *creature)
Definition Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition Unit.cpp:17417

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17398{
17399 if (!IsPlayer())
17400 return nullptr;
17401
17402 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17403 if (!creatureInfo)
17404 return nullptr;
17405
17406 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17407
17408 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17409 {
17410 delete pet;
17411 return nullptr;
17412 }
17413
17414 return pet;
17415}
#define sObjectMgr
Definition ObjectMgr.h:1650
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition Pet.cpp:976
Definition CreatureData.h:186

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18743{
18744 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18745 if (!vehInfo)
18746 return false;
18747
18748 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18751 return true;
18752}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition UnitDefines.h:161
@ UPDATEFLAG_VEHICLE
Definition UpdateData.h:46

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

825{
826 damage = sScriptMgr->DealDamage(attacker, victim, damage, damagetype);
827 // Xinef: initialize damage done for rage calculations
828 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
829 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
830
831 //if (attacker)
832 {
833 if (victim->IsAIEnabled)
834 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
835
836 if (attacker && attacker->IsAIEnabled)
837 attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);
838 }
839
840 // Hook for OnDamage Event
841 sScriptMgr->OnDamage(attacker, victim, damage);
842
843 if (victim->IsPlayer() && attacker != victim)
844 {
845 // Signal to pets that their owner was attacked
846 Pet* pet = victim->ToPlayer()->GetPet();
847
848 if (pet && pet->IsAlive())
849 pet->AI()->OwnerAttackedBy(attacker);
850 }
851
852 //Dont deal damage to unit if .cheat god is enable.
853 if (victim->IsPlayer())
854 {
855 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
856 {
857 return 0;
858 }
859 }
860
861 // Signal the pet it was attacked so the AI can respond if needed
862 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
863 victim->ToPet()->AI()->AttackedBy(attacker);
864
865 if (damagetype != NODAMAGE)
866 {
867 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
868 if (spellProto)
869 {
870 if (attacker && damagetype != DOT && spellProto->DmgClass == SPELL_DAMAGE_CLASS_MELEE && !(spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_HOLY))
871 attacker->DealDamageShieldDamage(victim);
872
873 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
875 }
876 else
878
879 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
880 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
881 {
882 if (victim != attacker && victim->IsPlayer())
883 {
884 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
885 {
886 if (spell->getState() == SPELL_STATE_PREPARING)
887 {
888 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
889 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
890 {
891 victim->InterruptNonMeleeSpells(false);
892 }
893 }
894 }
895 }
896 }
897
898 // We're going to call functions which can modify content of the list during iteration over it's elements
899 // Let's copy the list so we can prevent iterator invalidation
901 // copy damage to casters of this aura
902 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
903 {
904 // Check if aura was removed during iteration - we don't need to work on such auras
905 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
906 continue;
907 // check damage school mask
908 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
909 continue;
910
911 Unit* shareDamageTarget = (*i)->GetCaster();
912 if (!shareDamageTarget)
913 continue;
914 SpellInfo const* spell = (*i)->GetSpellInfo();
915
916 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
917
918 uint32 shareAbsorb = 0;
919 uint32 shareResist = 0;
920
921 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
922 {
923 shareAbsorb = shareDamage;
924 shareDamage = 0;
925 }
926 else
927 {
928 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
929 Unit::CalcAbsorbResist(sharedDamageInfo, true);
930 shareAbsorb = sharedDamageInfo.GetAbsorb();
931 shareResist = sharedDamageInfo.GetResist();
932 shareDamage = sharedDamageInfo.GetDamage();
933 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
934 }
935
936 if (attacker && shareDamageTarget->IsPlayer())
937 {
938 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
939 }
940
941 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
942 }
943 }
944
945 // Rage from Damage made (only from direct weapon damage)
946 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
947 {
948 uint32 weaponSpeedHitFactor;
949
950 switch (cleanDamage->attackType)
951 {
952 case BASE_ATTACK:
953 case OFF_ATTACK:
954 {
955 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
956 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
957 weaponSpeedHitFactor *= 2;
958
959 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
960 break;
961 }
962 case RANGED_ATTACK:
963 break;
964 default:
965 break;
966 }
967 }
968
969 if (!damage)
970 {
971 // Rage from absorbed damage
972 if (cleanDamage && cleanDamage->absorbed_damage)
973 {
974 if (victim->HasActivePowerType(POWER_RAGE))
975 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
976
977 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
978 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
979 }
980
981 return 0;
982 }
983
984 LOG_DEBUG("entities.unit", "DealDamageStart");
985
986 uint32 health = victim->GetHealth();
987 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
988
989 // duel ends when player has 1 or less hp
990 bool duel_hasEnded = false;
991 bool duel_wasMounted = false;
992 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
993 {
994 // xinef: situation not possible earlier, just return silently.
995 if (!attacker)
996 return 0;
997
998 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
999 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
1000 damage = health - 1;
1001
1002 duel_hasEnded = true;
1003 }
1004 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
1005 {
1006 Player* victimRider = victim->GetCharmer()->ToPlayer();
1007
1008 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
1009 {
1010 // xinef: situation not possible earlier, just return silently.
1011 if (!attacker)
1012 return 0;
1013
1014 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1015 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1016 damage = health - 1;
1017
1018 duel_wasMounted = true;
1019 duel_hasEnded = true;
1020 }
1021 }
1022
1023 if (attacker && attacker != victim)
1024 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1025 {
1026 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1027 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1028 // return 0;
1029
1030 if (Battleground* bg = killer->GetBattleground())
1031 {
1032 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1033 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1034 }
1035 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1036 }
1037
1038 if (victim->IsPlayer())
1039 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1040 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1041 {
1042 if (!victim->ToCreature()->hasLootRecipient())
1043 victim->ToCreature()->SetLootRecipient(attacker);
1044
1045 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1046 {
1047 uint32 unDamage = health < damage ? health : damage;
1048 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1049 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1050 }
1051 }
1052
1053 // Sparring
1054 if (victim->CanSparringWith(attacker))
1055 {
1056 if (damage >= victim->GetHealth())
1057 damage = 0;
1058
1059 uint32 sparringHealth = victim->GetHealth() * (victim->ToCreature()->GetSparringPct() / 100);
1060 if (victim->GetHealth() - damage <= sparringHealth)
1061 damage = 0;
1062 }
1063
1064 if (health <= damage)
1065 {
1066 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1067
1068 //if (attacker && victim->IsPlayer() && victim != attacker)
1069 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1070 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1071 }
1072 else
1073 {
1074 LOG_DEBUG("entities.unit", "DealDamageAlive");
1075
1076 //if (victim->IsPlayer())
1077 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1078
1079 victim->ModifyHealth(- (int32)damage);
1080
1081 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1082 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1083
1084 if (!victim->IsPlayer())
1085 {
1087 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1089
1090 if (attacker && attacker != victim)
1091 {
1092 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1093 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1094
1095 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1096 }
1097 }
1098 else // victim is a player
1099 {
1100 // random durability for items (HIT TAKEN)
1102 {
1105 }
1106 }
1107
1108 // Rage from damage received
1109 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1110 {
1111 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1112 victim->RewardRage(rageDamage, 0, false);
1113 }
1114
1115 if (attacker && attacker->IsPlayer())
1116 {
1117 // random durability for items (HIT DONE)
1119 {
1121 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1122 }
1123 }
1124
1125 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1126 {
1127 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1128 {
1129 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1130 {
1131 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1132 {
1133 if (spell->getState() == SPELL_STATE_PREPARING)
1134 {
1135 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1136 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1137 {
1138 victim->InterruptNonMeleeSpells(false);
1139 }
1140 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1141 {
1142 spell->Delayed();
1143 }
1144 }
1145 }
1146
1147 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1148 if (spell->getState() == SPELL_STATE_CASTING)
1149 {
1150 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1151 {
1152 spell->DelayedChannel();
1153 }
1154 }
1155 }
1156 }
1157 }
1158
1159 // last damage from duel opponent
1160 if (duel_hasEnded)
1161 {
1162 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1163
1164 ASSERT_NODEBUGINFO(he && he->duel);
1165
1166 if (duel_wasMounted) // In this case victim==mount
1167 victim->SetHealth(1);
1168 else
1169 he->SetHealth(1);
1170
1171 he->duel->Opponent->CombatStopWithPets(true);
1172 he->CombatStopWithPets(true);
1173
1174 he->CastSpell(he, 7267, true); // beg
1176 }
1177 }
1178
1179 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1180
1181 return damage;
1182}
@ SCORE_DAMAGE_DONE
Definition BattlegroundScore.h:32
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition DBCEnums.h:130
#define ASSERT_NODEBUGINFO
Definition Errors.h:69
@ CHEAT_GOD
Definition Player.h:994
EquipmentSlots
Definition Player.h:668
@ EQUIPMENT_SLOT_END
Definition Player.h:689
bool roll_chance_f(float chance)
Definition Random.h:57
@ POWER_RAGE
Definition SharedDefines.h:281
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition SharedDefines.h:658
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition SharedDefines.h:529
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition SharedDefines.h:521
@ DUEL_WON
Definition SharedDefines.h:3879
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition SharedDefines.h:555
@ SPELL_AURA_DAMAGE_SHIELD
Definition SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition SpellDefines.h:27
@ SPELL_STATE_PREPARING
Definition Spell.h:235
@ SPELL_STATE_CASTING
Definition Spell.h:236
@ NODAMAGE
Definition Unit.h:254
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:541
@ CURRENT_GENERIC_SPELL
Definition Unit.h:540
@ RATE_DURABILITY_LOSS_DAMAGE
Definition WorldConfig.h:477
virtual void OwnerAttackedBy(Unit *)
Definition CreatureAI.h:177
virtual void AttackedBy(Unit *)
Definition CreatureAI.h:154
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1333
bool hasLootRecipient() const
Definition Creature.h:234
float GetSparringPct() const
Definition Creature.h:191
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition Creature.cpp:3737
bool IsPlayer() const
Definition ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2163
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4836
Pet * GetPet() const
Definition Player.cpp:8977
bool GetCommandStatus(uint32 command) const
Definition Player.h:1184
uint32 ChannelInterruptFlags
Definition SpellInfo.h:354
uint32 InterruptFlags
Definition SpellInfo.h:352
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage to any victim (before damage apply)
Definition UnitAI.h:361
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition UnitAI.h:368
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14175
Pet * ToPet()
Definition Unit.h:714
bool IsCreatedByPlayer() const
Definition Unit.h:1275
Unit * GetCharmer() const
Definition Unit.cpp:10684
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition Unit.cpp:17738
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition Unit.cpp:19897
void SetHealth(uint32 val)
Definition Unit.cpp:15503
ObjectGuid GetCharmerGUID() const
Definition Unit.h:704
void DealDamageShieldDamage(Unit *victim)
Definition Unit.cpp:1981
virtual bool HasActivePowerType(Powers power)
Definition Unit.h:1094
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10530

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CanSparringWith(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DealDamageShieldDamage(), DIRECT_DAMAGE, SpellInfo::DmgClass, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_SCHOOL_MASK_HOLY, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealDamageShieldDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_necrotic_shard::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealDamageShieldDamage()

void Unit::DealDamageShieldDamage ( Unit victim)
Todo:
: Move this to a packet handler
1982{
1983 // We're going to call functions which can modify content of the list during iteration over it's elements
1984 // Let's copy the list so we can prevent iterator invalidation
1986 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1987 {
1988 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1989 // Damage shield can be resisted...
1990 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1991 {
1992 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1993 continue;
1994 }
1995
1996 // ...or immuned
1997 if (IsImmunedToDamageOrSchool(i_spellProto))
1998 {
1999 victim->SendSpellDamageImmune(this, i_spellProto->Id);
2000 continue;
2001 }
2002
2003 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
2004
2005 if (Unit* caster = (*dmgShieldItr)->GetCaster())
2006 {
2007 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
2008 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
2009 }
2010
2011 uint32 absorb = 0;
2012
2013 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
2014 Unit::CalcAbsorbResist(dmgInfo);
2015 absorb = dmgInfo.GetAbsorb();
2016 damage = dmgInfo.GetDamage();
2017
2018 Unit::DealDamageMods(this, damage, &absorb);
2019
2021 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
2022 data << victim->GetGUID();
2023 data << GetGUID();
2024 data << uint32(i_spellProto->Id);
2025 data << uint32(damage); // Damage
2026 int32 overkill = int32(damage) - int32(GetHealth());
2027 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2028 data << uint32(i_spellProto->GetSchoolMask());
2029 victim->SendMessageToSet(&data, true);
2030
2031 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2032 }
2033}
SpellMissInfo
Definition SharedDefines.h:1529
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1998
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition Unit.cpp:6544
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition Unit.cpp:6568
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition Unit.cpp:3507
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition Unit.cpp:11864
@ SMSG_SPELLDAMAGESHIELD
Definition Opcodes.h:621

References CalcAbsorbResist(), DealDamage(), DealDamageMods(), DamageInfo::GetAbsorb(), GetAuraEffectsByType(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetHealth(), SpellInfo::GetSchoolMask(), SpellInfo::Id, IsImmunedToDamageOrSchool(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), and SpellHitResult().

Referenced by DealDamage(), and DealMeleeDamage().

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
11028{
11029 int32 gain = 0;
11030
11031 if (healer)
11032 {
11033 if (victim->IsAIEnabled)
11034 victim->GetAI()->HealReceived(healer, addhealth);
11035
11036 if (healer->IsAIEnabled)
11037 healer->GetAI()->HealDone(victim, addhealth);
11038 }
11039
11040 if (addhealth)
11041 gain = victim->ModifyHealth(int32(addhealth));
11042
11043 // Hook for OnHeal Event
11044 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11045
11046 Unit* unit = healer;
11047
11048 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11049 unit = healer->GetOwner();
11050
11051 if (!unit)
11052 return gain;
11053
11054 if (Player* player = unit->ToPlayer())
11055 {
11056 if (Battleground* bg = player->GetBattleground())
11057 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11058
11059 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11060 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11061 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11062
11063 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11064 }
11065
11066 /*if (Player* player = victim->ToPlayer())
11067 {
11068 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11069 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11070 }*/
11071
11072 return gain;
11073}
@ SCORE_HEALING_DONE
Definition BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition UnitAI.h:371
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition UnitAI.h:377

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
1862{
1863 Unit* victim = damageInfo->target;
1864
1865 auto canTakeMeleeDamage = [&]()
1866 {
1867 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1868 };
1869
1870 if (!canTakeMeleeDamage())
1871 {
1872 return;
1873 }
1874
1875 // Hmmmm dont like this emotes client must by self do all animations
1876 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1878 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1880
1881 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1882 bool isParryHasteEnabled = !victim->IsCreature() ||
1884 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1885 {
1886 // Get attack timers
1887 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1888 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1889 // Reduce attack time
1890 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1891 {
1892 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1893 float percent60 = 3.0f * percent20;
1894 if (offtime > percent20 && offtime <= percent60)
1895 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1896 else if (offtime > percent60)
1897 {
1898 offtime -= 2.0f * percent20;
1899 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1900 }
1901 }
1902 else
1903 {
1904 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1905 float percent60 = 3.0f * percent20;
1906 if (basetime > percent20 && basetime <= percent60)
1907 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1908 else if (basetime > percent60)
1909 {
1910 basetime -= 2.0f * percent20;
1911 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1912 }
1913 }
1914 }
1915
1916 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1917 {
1918 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1919 {
1920 continue;
1921 }
1922
1923 // Call default DealDamage
1924 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1925 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1926 }
1927
1928 // gain rage if attack is fully blocked, dodged or parried
1930 {
1931 switch (damageInfo->attackType)
1932 {
1933 case BASE_ATTACK:
1934 case OFF_ATTACK:
1935 {
1936 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1937 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1938 break;
1939 }
1940 default:
1941 break;
1942 }
1943 }
1944
1945 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1946 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1947 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1948 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1949 {
1950 // -probability is between 0% and 40%
1951 // 20% base chance
1952 float Probability = 20.0f;
1953
1954 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1955 if (victim->GetLevel() < 30)
1956 Probability = 0.65f * victim->GetLevel() + 0.5f;
1957
1958 uint32 VictimDefense = victim->GetDefenseSkillValue();
1959 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1960
1961 // xinef: fix daze mechanics
1962 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1963
1964 if (Probability > 40.0f)
1965 Probability = 40.0f;
1966
1967 // Daze application
1968 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1969 if (roll_chance_f(std::max(0.0f, Probability)))
1970 CastSpell(victim, 1604, true);
1971 }
1972
1973 if (IsPlayer())
1974 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1975
1976 // Do effect if any damage done to target
1977 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1978 DealDamageShieldDamage(victim);
1979}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition CreatureData.h:48
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition SharedDefines.h:1935
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition SharedDefines.h:1941
@ CONFIG_ENABLE_DAZE
Definition WorldConfig.h:144
bool isWorldBoss() const
Definition Creature.h:125
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7254
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition Unit.h:1153
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3662
void HandleEmoteCommand(uint32 emoteId)
Definition Unit.cpp:2035
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:148

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageShieldDamage(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, GetAttackTime(), getAttackTimer(), Creature::GetCreatureTemplate(), GetDefenseSkillValue(), GetLevel(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), setAttackTimer(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1471{
1472 if (damageInfo == 0)
1473 return;
1474
1475 Unit* victim = damageInfo->target;
1476
1477 if (!victim)
1478 return;
1479
1480 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1481 return;
1482
1483 SpellInfo const* spellProto = damageInfo->spellInfo;
1484 if (!spellProto)
1485 {
1486 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1487 return;
1488 }
1489
1490 // Call default DealDamage
1491 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1492 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1493}
bool IsInFlight() const
Definition Unit.h:1660
SpellInfo const * spellInfo
Definition Unit.h:499

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5531{
5532 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5533 for (; range.first != range.second; ++range.first)
5534 {
5535 Aura* aura = range.first->second;
5536 if (!caster || aura->GetCasterGUID() == caster)
5537 {
5538 if (aura->GetDuration() < delaytime)
5539 aura->SetDuration(0);
5540 else
5541 aura->SetDuration(aura->GetDuration() - delaytime);
5542
5543 // update for out of range group members (on 1 slot use)
5545 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5546 }
5547 }
5548}
int32 GetDuration() const
Definition SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition SpellAuras.cpp:868
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition Unit.h:657

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15831{
15832 if (!m_charmInfo)
15833 return;
15834
15836 delete m_charmInfo;
15837 m_charmInfo = nullptr;
15838}
void RestoreState()
Definition CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4418{
4420}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16784
uint32 GetNativeDisplayId() const
Definition Unit.h:1930

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18303{
18304 if (!IsCreature())
18305 return;
18306
18307 if (apply)
18311}
@ UNIT_STATE_POSSESSED
Definition UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:733

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13601{
13602 if (!IsMounted())
13603 return;
13604
13607
13608 if (Player* player = ToPlayer())
13609 {
13610 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13611 data << GetPackGUID();
13612 data << player->GetSession()->GetOrderCounter(); // movement counter
13613 data << player->GetCollisionHeight();
13614 player->SendDirectMessage(&data);
13615 player->GetSession()->IncrementOrderCounter();
13616 }
13617
13618 WorldPacket data(SMSG_DISMOUNT, 8);
13619 data << GetPackGUID();
13620 SendMessageToSet(&data, true);
13621
13622 // dismount as a vehicle
13623 if (IsPlayer() && GetVehicleKit())
13624 {
13625 // Send other players that we are no longer a vehicle
13626 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13627 data << GetPackGUID();
13628 data << uint32(0);
13629 ToPlayer()->SendMessageToSet(&data, true);
13630 // Remove vehicle from player
13632 }
13633
13635
13636 // only resummon old pet if the player is already added to a map
13637 // this prevents adding a pet to a not created map which would otherwise cause a crash
13638 // (it could probably happen when logging in after a previous crash)
13639 if (Player* player = ToPlayer())
13640 {
13641 sScriptMgr->AnticheatSetUnderACKmount(player);
13642
13643 if (Pet* pPet = player->GetPet())
13644 {
13645 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13646 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13647 }
13648 else
13649 player->ResummonPetTemporaryUnSummonedIfAny();
13650
13651 // xinef: if we have charmed npc, remove stun also
13652 if (Unit* charm = player->GetCharm())
13653 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13654 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13655 }
13656}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:272
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:281
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5688
void RemoveVehicleKit()
Definition Unit.cpp:18754
@ SMSG_PLAYER_VEHICLE_DATA
Definition Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition Opcodes.h:1332
@ SMSG_DISMOUNT
Definition Opcodes.h:970

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11345{
11346 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11347
11348 if (powerType != POWER_HAPPINESS && gainedPower)
11349 {
11350 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11351 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11352 }
11353
11354 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11355}
@ POWER_HAPPINESS
Definition SharedDefines.h:284
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition Unit.cpp:11333

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19398{
19400
19401 if (Player* player = ToPlayer())
19402 {
19403 sScriptMgr->AnticheatSetUnderACKmount(player);
19404 }
19405}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20266{
20268 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20269 return;
20270
20271 Acore::AIRelocationNotifier notifier(*this);
20272 float radius = 60.0f;
20273 Cell::VisitObjects(this, notifier, radius);
20274}
@ NOTIFY_AI_RELOCATION
Definition Object.h:69
void RemoveFromNotify(uint16 f)
Definition Object.h:659
Definition GridNotifiers.h:91
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20165{
20167 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20168 return;
20169
20170 if (this->HasSharedVision())
20171 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20172 if (Player* player = (*itr))
20173 {
20174 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20175 continue;
20176 WorldObject* viewPoint = player;
20177 if (player->m_seer && player->m_seer->IsInWorld())
20178 viewPoint = player->m_seer;
20179 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20180 continue;
20181
20182 if (Unit* active = viewPoint->ToUnit())
20183 {
20184 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20185 // active = player;
20186
20187 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20188 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20189 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20190 float distsq = dx * dx + dy * dy + dz * dz;
20191 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20192 if (distsq < mindistsq)
20193 continue;
20194
20195 // this will be relocated below sharedvision!
20196 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20197 }
20198
20199 Acore::PlayerRelocationNotifier notifier(*player);
20200 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20202 notifier.SendToSelf();
20203 }
20204
20205 if (Player* player = this->ToPlayer())
20206 {
20207 WorldObject* viewPoint = player;
20208 if (player->m_seer && player->m_seer->IsInWorld())
20209 viewPoint = player->m_seer;
20210
20211 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20212 return;
20213
20214 if (Unit* active = viewPoint->ToUnit())
20215 {
20216 if (active->IsVehicle())
20217 active = player;
20218
20219 if (!player->GetFarSightDistance())
20220 {
20221 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20222 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20223 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20224 float distsq = dx * dx + dy * dy + dz * dz;
20225
20226 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20227 if (distsq < mindistsq)
20228 return;
20229
20230 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20231 }
20232 }
20233
20235
20236 Acore::PlayerRelocationNotifier notifier(*player);
20237 Cell::VisitObjects(viewPoint, notifier, player->GetSightRange());
20239 notifier.SendToSelf();
20240
20242 }
20243 else if (Creature* unit = this->ToCreature())
20244 {
20245 if (!unit->IsPositionValid())
20246 return;
20247
20248 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20249 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20250 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20251 float distsq = dx * dx + dy * dy + dz * dz;
20252 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20253 if (distsq < mindistsq)
20254 return;
20255
20256 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20257
20258 Acore::CreatureRelocationNotifier relocate(*unit);
20259 Cell::VisitObjects(unit, relocate, unit->GetVisibilityRange());
20260
20262 }
20263}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:30
#define VISIBILITY_DISTANCE_GIGANTIC
Definition ObjectDefines.h:34
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:70
static float GetReqMoveDistSq(uint32 map_type)
Definition DynamicVisibility.h:53
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:222
Unit * ToUnit()
Definition Object.h:210
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:1831
bool HasSharedVision() const
Definition Unit.h:1834
uint32 GetMapId() const
Definition Position.h:281
Definition Object.h:472
void AddToNotify(uint16 f)
Definition Object.cpp:2971
Definition GridNotifiers.h:83
Definition GridNotifiers.h:74
static void VisitFarVisibleObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185
bool IsPositionValid() const
Definition Position.cpp:183

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_DISTANCE_GIGANTIC, Cell::VisitFarVisibleObjects(), and Cell::VisitObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19494{
19496 if (!m_vehicle)
19497 return;
19498
19500 if (Player* player = ToPlayer())
19501 {
19502 player->SetCanTeleport(true);
19503 }
19507 /*_ExitVehicle(exitPosition);*/
19514
19515 if (Player* player = ToPlayer())
19516 {
19517 sScriptMgr->AnticheatSetUnderACKmount(player);
19518 }
19519}
Unit * GetVehicleBase() const
Definition Unit.cpp:18769

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), spell_dragonblight_devour_ghoul_periodic::OnRemove(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4147{
4148 Spell* spell = m_currentSpells[spellType];
4149 if (!spell)
4150 return;
4151
4152 if (spellType == CURRENT_CHANNELED_SPELL)
4153 spell->SendChannelUpdate(0);
4154
4155 spell->finish(ok);
4156}
void SendChannelUpdate(uint32 time)
Definition Spell.cpp:5129

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10702{
10703 if (!GetCharmerOrOwnerGUID())
10704 return const_cast<Unit*>(this)->ToPlayer();
10705
10706 if (Unit* owner = GetCharmerOrOwner())
10708
10709 return nullptr;
10710}
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1262

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
678{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), WorldState::HandleActiveZone(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), spell_random_aggro::HandleOnHit(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), spell_black_knight_ghoul_claw::HandleSpellHit(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), npc_dark_fiend::Reset(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10928{
10929 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10930 {
10931 Unit* unit = *itr;
10932 ++itr;
10933 if (unit->GetEntry() == entry && unit->IsCreature()
10934 && unit->ToCreature()->IsSummon()) // minion, actually
10935 Minions.push_back(unit->ToCreature());
10936 }
10937}
bool IsSummon() const
Definition Unit.h:777

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17241{
17242 if (!normalized || !IsPlayer())
17243 return float(GetAttackTime(attType)) / 1000.0f;
17244
17245 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17246 if (!Weapon)
17247 return 2.4f; // fist attack
17248
17249 switch (Weapon->GetTemplate()->InventoryType)
17250 {
17251 case INVTYPE_2HWEAPON:
17252 return 3.3f;
17253 case INVTYPE_RANGED:
17255 case INVTYPE_THROWN:
17256 return 2.8f;
17257 case INVTYPE_WEAPON:
17260 default:
17261 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17262 }
17263}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition ItemTemplate.h:359
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
Weapon
Definition boss_arlokk.cpp:67
Definition Item.h:220
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:489
uint32 SubClass
Definition ItemTemplate.h:622

References GetAttackTime(), Item::GetTemplate(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1347{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
755{
756 if (GetVictim() != nullptr)
757 return GetVictim();
758
759 if (!IsEngaged())
760 return nullptr;
761
762 if (!m_attackers.empty())
763 return *(m_attackers.begin());
764
765 return nullptr;
766}
bool IsEngaged() const
Definition Unit.h:914

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5650{
5651 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5652 return aurApp ? aurApp->GetBase() : nullptr;
5653}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5630

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5631{
5632 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5633 for (; range.first != range.second; ++range.first)
5634 {
5635 AuraApplication* app = range.first->second;
5636 Aura const* aura = app->GetBase();
5637
5638 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5639 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5640 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5641 && (!except || except != app))
5642 {
5643 return app;
5644 }
5645 }
5646 return nullptr;
5647}
uint8 GetEffectMask() const
Definition SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:660

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5656{
5657 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5658 while (rankSpell)
5659 {
5660 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5661 return aurApp;
5662 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5663 }
5664 return nullptr;
5665}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5751{
5752 uint32 count = 0;
5753 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5754
5755 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5756 {
5757 if (itr->second->GetBase()->GetStackAmount() == 0)
5758 ++count;
5759 else
5760 count += (uint32)itr->second->GetBase()->GetStackAmount();
5761 }
5762
5763 return count;
5764}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5603{
5604 AuraEffectList const& auras = GetAuraEffectsByType(type);
5605 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5606 {
5607 SpellInfo const* spell = (*i)->GetSpellInfo();
5608 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5609 {
5610 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5611 continue;
5612 return (*i);
5613 }
5614 }
5615 return nullptr;
5616}
flag96 SpellFamilyFlags
Definition SpellInfo.h:388
uint32 SpellFamilyName
Definition SpellInfo.h:387
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition Util.h:468

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5589{
5590 AuraEffectList const& auras = GetAuraEffectsByType(type);
5591 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5592 {
5593 if (effIndex != (*itr)->GetEffIndex())
5594 continue;
5595 SpellInfo const* spell = (*itr)->GetSpellInfo();
5596 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5597 return *itr;
5598 }
5599 return nullptr;
5600}
uint32 SpellIconID
Definition SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5563{
5564 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5565 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5566 {
5567 if (itr->second->HasEffect(effIndex)
5568 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5569 {
5570 return itr->second->GetBase()->GetEffect(effIndex);
5571 }
5572 }
5573 return nullptr;
5574}

References AuraEffect::GetBase(), Aura::GetEffect(), and m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5619{
5621 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5622 {
5623 if ((*itr)->GetId() == spellid)
5624 return *itr;
5625 }
5626
5627 return nullptr;
5628}
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5577{
5578 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5579 while (rankSpell)
5580 {
5581 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5582 return aurEff;
5583 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5584 }
5585 return nullptr;
5586}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5562

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), GetDiseasesByCaster(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1391{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealDamageShieldDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), RedirectSpellEvent::Execute(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5668{
5669 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5670 return aurApp ? aurApp->GetBase() : nullptr;
5671}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5655

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods(), and spell_dk_pestilence::HandleScriptEffect().

◆ GetBoundaryRadius()

float Unit::GetBoundaryRadius ( ) const
inline

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17101{
17102 // Not apply this to creature casted spells with casttime == 0
17103 if (CastingTime == 0 && IsCreature() && !IsPet())
17104 return 3500;
17105
17106 if (CastingTime > 7000) CastingTime = 7000;
17107 if (CastingTime < 1500) CastingTime = 1500;
17108
17109 if (damagetype == DOT && !spellProto->IsChanneled())
17110 CastingTime = 3500;
17111
17112 int32 overTime = 0;
17113 uint8 effects = 0;
17114 bool DirectDamage = false;
17115 bool AreaEffect = false;
17116
17117 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17118 {
17119 switch (spellProto->Effects[i].Effect)
17120 {
17126 case SPELL_EFFECT_HEAL:
17127 DirectDamage = true;
17128 break;
17130 switch (spellProto->Effects[i].ApplyAuraName)
17131 {
17135 if (spellProto->GetDuration())
17136 overTime = spellProto->GetDuration();
17137 break;
17138 default:
17139 // -5% per additional effect
17140 ++effects;
17141 break;
17142 }
17143 default:
17144 break;
17145 }
17146
17147 if (spellProto->Effects[i].IsTargetingArea())
17148 AreaEffect = true;
17149 }
17150
17151 // Combined Spells with Both Over Time and Direct Damage
17152 if (overTime > 0 && DirectDamage)
17153 {
17154 // mainly for DoTs which are 3500 here otherwise
17155 uint32 OriginalCastTime = spellProto->CalcCastTime();
17156 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17157 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17158 // Portion to Over Time
17159 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17160
17161 if (damagetype == DOT)
17162 CastingTime = uint32(CastingTime * PtOT);
17163 else if (PtOT < 1.0f)
17164 CastingTime = uint32(CastingTime * (1 - PtOT));
17165 else
17166 CastingTime = 0;
17167 }
17168
17169 // Area Effect Spells receive only half of bonus
17170 if (AreaEffect)
17171 CastingTime /= 2;
17172
17173 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17174 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17175 {
17176 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17177 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17178 {
17179 CastingTime /= 2;
17180 break;
17181 }
17182 }
17183
17184 // -5% of total per any additional effect
17185 for (uint8 i = 0; i < effects; ++i)
17186 CastingTime *= 0.95f;
17187
17188 return CastingTime;
17189}
@ SPELL_EFFECT_POWER_BURN
Definition SharedDefines.h:851
@ SPELL_EFFECT_HEALTH_LEECH
Definition SharedDefines.h:798
@ SPELL_EFFECT_HEAL
Definition SharedDefines.h:799
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition SharedDefines.h:796
@ SPELL_EFFECT_POWER_DRAIN
Definition SharedDefines.h:797
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:791
@ SPELL_EFFECT_APPLY_AURA
Definition SharedDefines.h:795
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10748{
10749 if (ObjectGuid charm_guid = GetCharmGUID())
10750 {
10751 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10752 return pet;
10753
10754 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10756 }
10757
10758 return nullptr;
10759}
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:712
ObjectGuid GetCharmGUID() const
Definition Unit.h:706
Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:199

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1255 {
1256 if (Unit* u = GetCharmerOrOwner())
1257 return u;
1258
1259 return (Unit*)this;
1260 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10693{
10695 if (guid.IsPlayer())
10696 return ObjectAccessor::GetPlayer(*this, guid);
10697
10698 return const_cast<Unit*>(this)->ToPlayer();
10699}
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
826{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), Player::CheckSkillLearnedBySpell(), spell_class_call_handler::FilterTargets(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetClientControlling()

Player const * Unit::GetClientControlling ( ) const
21253{
21254 // Serverside reverse "mover" deduction logic at controlled unit
21255
21256 // Applies only to player controlled units
21258 {
21259 // Charm always removes control from original client...
21260 if (GetCharmerGUID())
21261 {
21262 // ... but if it is a possessing charm, some other client may have control
21264 {
21265 Unit const* charmer = GetCharmer();
21266 if (charmer && charmer->IsPlayer())
21267 return static_cast<Player const*>(charmer);
21268 }
21269 }
21270 else if (IsPlayer())
21271 {
21272 // Check if anything prevents original client from controlling
21273 if (IsClientControlled(static_cast<Player const*>(this)))
21274 return static_cast<Player const*>(this);
21275 }
21276 }
21277 return nullptr;
21278}
bool IsClientControlled(Player const *exactClient=nullptr) const
Definition Unit.cpp:21225

References GetCharmer(), GetCharmerGUID(), Object::HasFlag(), IsClientControlled(), Object::IsPlayer(), UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_FLAG_POSSESSED.

Referenced by SendMoveRoot(), SetCanFly(), SetDisableGravity(), SetFeatherFall(), SetHover(), SetSpeed(), and SetWaterWalking().

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

20985{
20986 float scaleMod = GetObjectScale(); // 99% sure about this
20987 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
20988
20989 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20990 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20991 float collisionHeight = 0.0f;
20992
20993 if (IsMounted())
20994 {
20996 {
20997 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20998 {
20999 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
21000 }
21001 }
21002 }
21003 else
21004 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
21005
21006 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
21007}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition ObjectDefines.h:49
float GetObjectScale() const
Definition Object.h:119
Definition DBCStructure.h:721
uint32 ModelId
Definition DBCStructure.h:723
float scale
Definition DBCStructure.h:726
Definition DBCStructure.h:775
float Scale
Definition DBCStructure.h:779
float CollisionHeight
Definition DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), GetRandomContactPoint(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), WorldSession::ProcessMovementInfo(), ProcessTerrainStatusUpdate(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

20979{
20980 return GetCollisionWidth() / 2;
20981}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition Unit.cpp:20941

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

20942{
20943 if (IsPlayer())
20944 return GetObjectSize();
20945
20946 float scaleMod = GetObjectScale(); // 99% sure about this
20947 float objectSize = GetObjectSize();
20948 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
20949
20951 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20952 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20953
20954 if (IsMounted())
20955 {
20957 {
20958 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20959 {
20960 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
20961 modelData = mountModelData;
20962 }
20963 }
20964 }
20965
20966 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
20967 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
20968 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
20969}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:44
float GetObjectSize() const
Definition Object.cpp:2789
float CollisionWidth
Definition DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19220{
19221 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19222 return CalculatePct(damage, percent);
19223}
float GetCombatRatingReduction(CombatRating cr) const
Definition Unit.cpp:19207

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19208{
19209 if (Player const* player = ToPlayer())
19210 return player->GetRatingBonusValue(cr);
19211 // Player's pet get resilience from owner
19212 else if (IsPet() && GetOwner())
19213 if (Player* owner = GetOwner()->ToPlayer())
19214 return owner->GetRatingBonusValue(cr);
19215
19216 return 0.0f;
19217}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
927{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
993{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
994{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10743{
10745}
@ SUMMON_SLOT_MINIPET
Definition SharedDefines.h:3566
Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15672{
15673 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15674 switch (power)
15675 {
15676 case POWER_MANA:
15677 return GetCreateMana();
15678 case POWER_RAGE:
15679 return 1000;
15680 case POWER_FOCUS:
15681 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15682 case POWER_ENERGY:
15683 return 100;
15684 case POWER_HAPPINESS:
15685 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15686 case POWER_RUNIC_POWER:
15687 return 1000;
15688 case POWER_RUNE:
15689 return 0;
15690 case POWER_HEALTH:
15691 return 0;
15692 default:
15693 break;
15694 }
15695
15696 return 0;
15697}
@ POWER_HEALTH
Definition SharedDefines.h:289
@ POWER_RUNIC_POWER
Definition SharedDefines.h:286
@ POWER_ENERGY
Definition SharedDefines.h:283
@ POWER_RUNE
Definition SharedDefines.h:285
@ POWER_FOCUS
Definition SharedDefines.h:282
uint32 GetCreateMana() const
Definition Unit.h:1111

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15208{
15209 if (IsPlayer())
15210 {
15212 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15213 if (ssEntry && ssEntry->creatureType > 0)
15214 return ssEntry->creatureType;
15215 else
15217 }
15218 else
15219 return ToCreature()->GetCreatureTemplate()->type;
15220}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2645
ShapeshiftForm
Definition UnitDefines.h:68
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1911
uint32 type
Definition CreatureData.h:222
Definition DBCStructure.h:1818
int32 creatureType
Definition DBCStructure.h:1824

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
812 {
813 uint32 creatureType = GetCreatureType();
814 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
815 }
uint32 GetCreatureType() const
Definition Unit.cpp:15207

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1536{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4221{
4222 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4223 return spell->GetCastTime();
4224 return 0;
4225}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4212

References FindCurrentSpellBySpellId(), and Spell::GetCastTime().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

21215{
21216 std::stringstream sstr;
21217 sstr << WorldObject::GetDebugInfo() << "\n"
21218 << std::boolalpha
21219 << "AliveState: " << IsAlive()
21220 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21221 << " Class: " << std::to_string(getClass());
21222 return sstr.str();
21223}
std::string GetDebugInfo() const override
Definition Object.cpp:2488

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16652{
16653 return IDLE_MOTION_TYPE;
16654}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3663{
3664 if (IsPlayer())
3665 {
3666 // in PvP use full skill instead current skill value
3667 uint32 value = (target && target->IsPlayer())
3670 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3671 return value;
3672 }
3673 else
3674 return GetUnitMeleeSkill(target);
3675}
@ SKILL_DEFENSE
Definition SharedDefines.h:3131
@ CR_DEFENSE_SKILL
Definition Unit.h:220
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5469
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5486

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15033{
15034 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15035 {
15036 if (i->DRGroup != group)
15037 continue;
15038
15039 if (!i->hitCount)
15040 return DIMINISHING_LEVEL_1;
15041
15042 if (!i->hitTime)
15043 return DIMINISHING_LEVEL_1;
15044
15045 // If last spell was casted more than 15 seconds ago - reset the count.
15046 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15047 {
15048 i->hitCount = DIMINISHING_LEVEL_1;
15049 return DIMINISHING_LEVEL_1;
15050 }
15051 // or else increase the count.
15052 else
15053 return DiminishingLevels(i->hitCount);
15054 }
15055 return DIMINISHING_LEVEL_1;
15056}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5913{
5914 static const AuraType diseaseAuraTypes[] =
5915 {
5916 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5917 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5919 };
5920
5921 ObjectGuid drwGUID;
5922
5923 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5924 drwGUID = playerCaster->getRuneWeaponGUID();
5925
5926 uint32 diseases = 0;
5927 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5928 {
5929 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5930 {
5931 // Get auras with disease dispel type by caster
5932 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5933 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5934 {
5935 ++diseases;
5936
5937 if (mode == 1)
5938 {
5939 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5940 i = m_modAuras[diseaseAuraTypes[index]].begin();
5941 continue;
5942 }
5943 // used for glyph of scourge strike
5944 else if (mode == 2)
5945 {
5946 Aura* aura = (*i)->GetBase();
5947 uint32 countMin = aura->GetMaxDuration();
5948 uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
5949
5950 if (AuraEffect const* epidemic = (*i)->GetCaster()->GetAuraEffectOfRankedSpell(49036, EFFECT_0))
5951 countMax += epidemic->GetAmount();
5952
5953 if (countMin < countMax)
5954 {
5955 aura->SetDuration(uint32(aura->GetDuration() + 3000));
5956 aura->SetMaxDuration(countMin + 3000);
5957 }
5958 }
5959 }
5960 ++i;
5961 }
5962 }
5963 return diseases;
5964}
@ EFFECT_0
Definition SharedDefines.h:31
@ DISPEL_DISEASE
Definition SharedDefines.h:1386
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
int32 GetMaxDuration() const
Definition SpellAuras.h:129
void SetMaxDuration(int32 duration)
Definition SpellAuras.h:130
int32 GetMaxDuration() const
Definition SpellInfo.cpp:2357
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5576

References DISPEL_DISEASE, EFFECT_0, GetAuraEffectOfRankedSpell(), AuraEffect::GetCaster(), Aura::GetDuration(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::GetSpellInfo(), m_modAuras, RemoveAura(), Aura::SetDuration(), Aura::SetMaxDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5674{
5675 // we should not be able to dispel diseases if the target is affected by unholy blight
5676 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5677 dispelMask &= ~(1 << DISPEL_DISEASE);
5678
5679 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5680 bool positive = rank >= REP_FRIENDLY;
5681
5682 // Neutral unit not at war with caster should be treated as a friendly unit
5683 if (rank == REP_NEUTRAL)
5684 {
5685 if (Player* casterPlayer = caster->GetAffectingPlayer())
5686 {
5687 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5688 {
5689 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5690 {
5691 if (factionEntry->CanBeSetAtWar())
5692 {
5693 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5694 }
5695 }
5696 }
5697 }
5698 }
5699
5700 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5701 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5702 {
5703 Aura* aura = itr->second->GetBase();
5704
5705 // don't try to remove passive auras
5706 if (aura->IsPassive())
5707 continue;
5708
5709 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5710 {
5711 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5712 {
5713 // do not remove positive auras if friendly target
5714 // negative auras if non-friendly target
5715 if (itr->second->IsPositive() == positive)
5716 continue;
5717 }
5718
5719 // Banish should only be dispelled by Mass Dispel
5720 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5721 {
5722 continue;
5723 }
5724
5725 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5726 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5727 // Polymorph instead of 1 / (5 + 1) -> 16%.
5728 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5729 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5730 if (charges > 0)
5731 dispelList.push_back(std::make_pair(aura, charges));
5732 }
5733 }
5734}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition SharedDefines.h:662
@ MECHANIC_BANISH
Definition SharedDefines.h:1354
@ SPELL_ATTR0_NO_IMMUNITIES
Definition SharedDefines.h:422
@ REP_FRIENDLY
Definition SharedDefines.h:184
@ DISPEL_MAGIC
Definition SharedDefines.h:1384
uint8 GetStackAmount() const
Definition SpellAuras.h:148
uint8 GetCharges() const
Definition SpellAuras.h:141
bool IsPassive() const
Definition SpellAuras.cpp:1082
uint32 Mechanic
Definition SpellInfo.h:323
uint32 Dispel
Definition SpellInfo.h:322
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5789
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:672
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1498

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::CheckCast(), and Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition Unit.cpp:20903
uint32 GetDisplayId() const
Definition Unit.h:1928

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
20904{
20905 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
20906 {
20907 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
20908 {
20909 return DisplayRace(displayExtra->DisplayRaceID);
20910 }
20911 }
20912 return DisplayRace::None;
20913}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition SharedDefines.h:111
Definition DBCStructure.h:739

References None, sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5967{
5968 static const AuraType diseaseAuraTypes[] =
5969 {
5973 };
5974
5975 uint32 dots = 0;
5976 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5977 {
5978 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5979 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5980 {
5981 // Get auras by caster
5982 if ((*i)->GetCasterGUID() == casterGUID)
5983 ++dots;
5984 }
5985 }
5986 return dots;
5987}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6228{
6229 if (m_dynObj.empty())
6230 return nullptr;
6231 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6232 {
6233 DynamicObject* dynObj = *i;
6234 if (dynObj->GetSpellId() == spellId)
6235 return dynObj;
6236 }
6237 return nullptr;
6238}
Definition DynamicObject.h:35
uint32 GetSpellId() const
Definition DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), WorldSession::HandleFarSightOpcode(), and boss_akilzon::JustEngagedWith().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2149{
2150 float victimResistance = float(victim->GetResistance(schoolMask));
2151 if (owner)
2152 {
2153 // Xinef: pets inherit 100% of masters penetration
2154 // Xinef: excluding traps
2155 Player const* player = owner->GetSpellModOwner();
2156 if (player && owner->GetEntry() != WORLD_TRIGGER)
2157 {
2158 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2159 victimResistance -= float(player->GetSpellPenetrationItemMod());
2160 }
2161 else
2162 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2163 }
2164
2165 victimResistance = std::max(victimResistance, 0.0f);
2166 if (owner)
2167 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2168
2169 static uint32 const BOSS_LEVEL = 83;
2170 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2171 uint32 level = victim->GetLevel();
2172 float resistanceConstant = 0.0f;
2173
2174 if (level == BOSS_LEVEL)
2175 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2176 else
2177 resistanceConstant = level * 5.0f;
2178
2179 return victimResistance / (victimResistance + resistanceConstant);
2180}
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1971

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10236{
10237 // always neutral when no template entry found
10238 if (!factionTemplateEntry)
10239 return REP_NEUTRAL;
10240
10241 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10242 if (!targetFactionTemplateEntry)
10243 return REP_NEUTRAL;
10244
10245 // xinef: check forced reputation for self also
10246 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10247 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10248 return *repRank;
10249
10250 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10251 {
10252 // check contested flags
10253 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10254 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10255 return REP_HOSTILE;
10256 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10257 return *repRank;
10258 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10259 {
10260 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10261 {
10262 if (factionEntry->CanHaveReputation())
10263 {
10264 // CvP case - check reputation, don't allow state higher than neutral when at war
10265 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10266 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10267 repRank = std::min(REP_NEUTRAL, repRank);
10268 return repRank;
10269 }
10270 }
10271 }
10272 }
10273
10274 // common faction based check
10275 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10276 return REP_HOSTILE;
10277 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10278 return REP_FRIENDLY;
10279 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10280 return REP_FRIENDLY;
10281 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10282 return REP_HOSTILE;
10283 // neutral by default
10284 return REP_NEUTRAL;
10285}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition DBCEnums.h:331
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:476
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition UnitDefines.h:295
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10086{
10087 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10088 if (!entry)
10089 {
10090 static ObjectGuid guid; // prevent repeating spam same faction problem
10091
10092 if (GetGUID() != guid)
10093 {
10094 if (Player const* player = ToPlayer())
10095 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10096 else if (Creature const* creature = ToCreature())
10097 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10098 else
10099 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10100
10101 guid = GetGUID();
10102 }
10103 }
10104 return entry;
10105}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition Object.h:128
uint32 GetFaction() const
Definition Unit.h:834
std::string const & GetName() const
Definition Object.h:525

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), npc_necrotic_shard::DamageTaken(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), PatchValuesUpdate(), and RespondsToCallForHelp().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11152{
11153 // Sequence: charmed, pet, other guardians
11154 Unit* unit = GetCharm();
11155 if (!unit)
11156 if (ObjectGuid guid = GetMinionGUID())
11157 unit = ObjectAccessor::GetUnit(*this, guid);
11158
11159 return unit;
11160}
ObjectGuid GetMinionGUID() const
Definition Unit.h:702

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstCurrentCastingSpell()

Spell * Unit::GetFirstCurrentCastingSpell ( ) const
4204{
4205 for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
4206 if (m_currentSpells[i] && m_currentSpells[i]->GetCastTimeRemaining() > 0)
4207 return m_currentSpells[i];
4208
4209 return nullptr;
4210}

References CURRENT_MAX_SPELL, and m_currentSpells.

Referenced by ChaseMovementGenerator< T >::DoUpdate().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10713{
10714 if (ObjectGuid pet_guid = GetMinionGUID())
10715 {
10716 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10717 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10718 return (Minion*)pet;
10719
10720 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10721 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10722 }
10723
10724 return nullptr;
10725}
void SetMinionGUID(ObjectGuid guid)
Definition Unit.h:703
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const &)
Definition ObjectAccessor.cpp:234

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6269{
6270 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6271 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6272 if (go->GetSpellId() == spellId)
6273 return go;
6274
6275 return nullptr;
6276}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10728{
10729 if (ObjectGuid pet_guid = GetPetGUID())
10730 {
10731 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10732 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10733 return (Guardian*)pet;
10734
10735 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10736 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10737 }
10738
10739 return nullptr;
10740}
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
Definition TemporarySummon.h:96
void SetPetGUID(ObjectGuid guid)
Definition Unit.h:707
ObjectGuid GetPetGUID() const
Definition Unit.h:708

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_dark_fiend::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealDamageShieldDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), spell_illidari_council_empyreal_balance::HandleAfterCast(), spell_illidari_council_empyreal_equivalency::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14208{
14209 int32 gain = 0;
14210
14211 if (dVal == 0)
14212 return 0;
14213
14214 int32 curHealth = (int32)GetHealth();
14215
14216 int32 val = dVal + curHealth;
14217 if (val <= 0)
14218 {
14219 return -curHealth;
14220 }
14221
14222 int32 maxHealth = (int32)GetMaxHealth();
14223
14224 if (val < maxHealth)
14225 gain = dVal;
14226 else if (curHealth != maxHealth)
14227 gain = maxHealth - curHealth;
14228
14229 return gain;
14230}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1562{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
950{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
988{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), CreateTamedPetFrom(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11096{
11097 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11098 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11099 return victim;
11100
11102 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11103 {
11104 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11105 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11106 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11107 && _IsValidAttackTarget(magnet, spellInfo)
11108 /*&& IsWithinLOSInMap(magnet)*/)
11109 {
11110 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11111 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11112
11113 if (magnet->IsTotem())
11114 {
11115 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11116 if (spellInfo->Speed > 0.0f)
11117 {
11118 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11119 if (dist < 5.0f)
11120 dist = 5.0f;
11121 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11122 }
11123
11124 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11125 }
11126
11127 return magnet;
11128 }
11129 }
11130 return victim;
11131}
@ SPELL_ATTR1_NO_REDIRECTION
Definition SharedDefines.h:433
@ SPELL_ATTR0_IS_ABILITY
Definition SharedDefines.h:397
@ SPELL_AURA_SPELL_MAGNET
Definition SpellAuraDefines.h:159
Definition TotemAI.h:47
Definition Unit.h:2277
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition Unit.cpp:13961
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1278

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), Battleground::AddPlayer(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), npc_dark_fiend::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), spell_illidari_council_empyreal_balance::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), npc_necrotic_shard::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
6049{
6050 int32 modifier = 0;
6051
6052 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6053 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6054 if ((*i)->GetAmount() < modifier)
6055 modifier = (*i)->GetAmount();
6056
6057 return modifier;
6058}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6204{
6205 int32 modifier = 0;
6206
6207 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6208 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6209 {
6210 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6211 modifier = (*i)->GetAmount();
6212 }
6213
6214 return modifier;
6215}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6100{
6101 int32 modifier = 0;
6102
6103 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6104 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6105 {
6106 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6107 modifier = (*i)->GetAmount();
6108 }
6109
6110 return modifier;
6111}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6152{
6153 int32 modifier = 0;
6154
6155 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6156 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6157 {
6158 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6159 modifier = (*i)->GetAmount();
6160 }
6161
6162 return modifier;
6163}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
6035{
6036 int32 modifier = 0;
6037
6038 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6039 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6040 {
6041 if ((*i)->GetAmount() > modifier)
6042 modifier = (*i)->GetAmount();
6043 }
6044
6045 return modifier;
6046}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6190{
6191 int32 modifier = 0;
6192
6193 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6194 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6195 {
6196 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6197 modifier = (*i)->GetAmount();
6198 }
6199
6200 return modifier;
6201}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
6086{
6087 int32 modifier = 0;
6088
6089 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6090 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6091 {
6092 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
6093 modifier = (*i)->GetAmount();
6094 }
6095
6096 return modifier;
6097}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6138{
6139 int32 modifier = 0;
6140
6141 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6142 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6143 {
6144 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6145 modifier = (*i)->GetAmount();
6146 }
6147
6148 return modifier;
6149}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1098{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1171{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1066

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3171{
3172 if (!spell)
3173 return 0;
3174 int32 resist_mech = 0;
3175 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3176 {
3177 if (!spell->Effects[eff].IsEffect())
3178 break;
3179 int32 effect_mech = spell->GetEffectMechanic(eff);
3180 if (effect_mech)
3181 {
3183 if (resist_mech < temp)
3184 resist_mech = temp;
3185 }
3186 }
3187 return resist_mech;
3188}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6113

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2707{
2708 if (!attacker)
2709 {
2710 return false;
2711 }
2712
2713 AttackerSet attackers = getAttackers();
2714
2715 if (attackers.size() <= 1) // if the attackers are not more than one
2716 {
2717 return false;
2718 }
2719
2720 float meleeReach = GetExactDist2d(attacker);
2721 if (meleeReach <= 0)
2722 {
2723 return false;
2724 }
2725
2726 float minAngle = 0;
2727 Unit *refUnit = nullptr;
2728 uint32 validAttackers = 0;
2729
2730 double attackerSize = attacker->GetCollisionRadius();
2731
2732 for (auto const& otherAttacker: attackers)
2733 {
2734 // if the otherAttacker is not valid, skip
2735 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2736 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2737 {
2738 continue;
2739 }
2740
2741 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2742 if (minAngle == 0 || curretAngle < minAngle)
2743 {
2744 minAngle = curretAngle;
2745 refUnit = otherAttacker;
2746 }
2747
2748 validAttackers++;
2749 }
2750
2751 if (!validAttackers || !refUnit)
2752 {
2753 return false;
2754 }
2755
2756 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2757 float requiredAngle = atan(contactDist / meleeReach);
2758 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2759
2760 // in instance: the more attacker there are, the higher will be the tollerance
2761 // outside: creatures should not intersecate
2762 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2763
2764 if (attackersAngle > angleTollerance)
2765 {
2766 return false;
2767 }
2768
2769 double angle = atan(contactDist / meleeReach);
2770
2771 float angularRadius = frand(0.1f, 0.3f) + angle;
2772 int8 direction = (urand(0, 1) ? -1 : 1);
2773 float currentAngle = GetAngle(refUnit);
2774 float absAngle = currentAngle + angularRadius * direction;
2775
2776 float x, y, z;
2777 float distance = meleeReach - GetObjectSize();
2778 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2779
2780 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2781 {
2782 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2783
2784 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2785 {
2786 return false;
2787 }
2788 }
2789
2790 pos.Relocate(x, y, z);
2791
2792 return true;
2793}
std::int8_t int8
Definition Define.h:105
float frand(float min, float max)
Definition Random.cpp:57
bool IsDungeon() const
Definition Map.h:295
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition Unit.cpp:20978
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:652
AttackerSet const & getAttackers() const
Definition Unit.h:883
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition Object.cpp:2644
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1241{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition Unit.cpp:19219

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11134{
11136 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11137 {
11138 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11139 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11140 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11141 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11142 if (roll_chance_i((*i)->GetAmount()))
11143 {
11144 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11145 return magnet;
11146 }
11147 }
11148 return victim;
11149}
bool roll_chance_i(int chance)
Definition Random.h:63
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
684{
685 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
686 return std::max(range, NOMINAL_MELEE_RANGE);
687}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:47
float GetCombatReach() const override
Definition Unit.h:860

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by SmartAI::DistanceYourself(), GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
861{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition ObjectDefines.h:46

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
)
19226{
19227 // Hardcoded cases
19228 switch (spellId)
19229 {
19230 case 7090: // Bear form
19231 return 29414;
19232 case 35200: // Roc form
19233 return 4877;
19234 default:
19235 break;
19236 }
19237
19238 if (IsPlayer())
19239 {
19240 if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))
19241 return ModelId;
19242 }
19243
19244 uint32 modelid = 0;
19245 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19246 if (formEntry && formEntry->modelID_A)
19247 {
19248 // Take the alliance modelid as default
19249 if (!IsPlayer())
19250 return formEntry->modelID_A;
19251 else
19252 {
19254 modelid = formEntry->modelID_A;
19255 else
19256 modelid = formEntry->modelID_H;
19257
19258 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19259 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19260 modelid = formEntry->modelID_A;
19261 }
19262 }
19263
19264 return modelid;
19265}
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5849
uint8 getRace(bool original=false) const
Definition Unit.cpp:20884
uint32 modelID_H
Definition DBCStructure.h:1828
uint32 modelID_A
Definition DBCStructure.h:1827

References getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, sObjectMgr, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15314{
15315 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15316 {
15317 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15318 return 0.0f;
15319 }
15320
15321 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15322 return 0.0f;
15323
15324 return m_auraModifiersGroup[unitMod][modifierType];
15325}
@ MODIFIER_TYPE_END
Definition Unit.h:132

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1713{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), Creature::CanCreatureAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), SmartAI::DistanceYourself(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), spell_chapter2_persuasive_strike::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), Creature::IsUpdateNeeded(), JumpTo(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_volkhan::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), boss_taldaram::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), Map::ScriptsProcess(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnAnArenaNPC(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_spark_of_ionar::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1714{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1926{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1045{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11191{
11192 Player* player = nullptr;
11193 if (IsPlayer())
11194 player = ToPlayer();
11195 // Should we enable this also for charmed units?
11196 else if (IsCreature() && IsPet())
11197 player = GetOwner()->ToPlayer();
11198
11199 if (!player)
11200 return nullptr;
11201 Group* group = player->GetGroup();
11202 // When there is no group check pet presence
11203 if (!group)
11204 {
11205 // We are pet now, return owner
11206 if (player != this)
11207 return IsWithinDistInMap(player, radius) ? player : nullptr;
11208 Unit* pet = GetGuardianPet();
11209 // No pet, no group, nothing to return
11210 if (!pet)
11211 return nullptr;
11212 // We are owner now, return pet
11213 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11214 }
11215
11216 std::vector<Unit*> nearMembers;
11217 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11218 nearMembers.reserve(group->GetMembersCount() * 2);
11219
11220 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11221 if (Player* Target = itr->GetSource())
11222 {
11223 if (Target != this && !IsWithinDistInMap(Target, radius))
11224 continue;
11225
11226 // IsHostileTo check duel and controlled by enemy
11227 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11228 nearMembers.push_back(Target);
11229
11230 // Push player's pet to vector
11231 if (Unit* pet = Target->GetGuardianPet())
11232 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11233 nearMembers.push_back(pet);
11234 }
11235
11236 if (nearMembers.empty())
11237 return nullptr;
11238
11239 uint32 randTarget = urand(0, nearMembers.size() - 1);
11240 return nearMembers[randTarget];
11241}
Definition GroupReference.h:27
Definition Group.h:169
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
Group * GetGroup()
Definition Player.h:2472
Guardian * GetGuardianPet() const
Definition Unit.cpp:10727
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1354

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
838{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4829{
4830 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4831 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4832 {
4833 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4834 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4835 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4836 && (!except || except != itr->second))
4837 {
4838 return itr->second;
4839 }
4840 }
4841 return nullptr;
4842}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition Unit.h:656

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1337{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10677{
10678 if (ObjectGuid ownerGUID = GetOwnerGUID())
10679 return ObjectAccessor::GetUnit(*this, ownerGUID);
10680
10681 return nullptr;
10682}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), spell_item_fetch_ball::SelectTarget(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18847{
18848 Unit* owner = GetCharmerOrOwnerOrSelf();
18849 Group* group = nullptr;
18850 if (owner->IsPlayer())
18851 group = owner->ToPlayer()->GetGroup();
18852
18853 if (group)
18854 {
18855 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18856
18857 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18858 {
18859 Player* Target = itr->GetSource();
18860
18861 // IsHostileTo check duel and controlled by enemy
18862 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18863 {
18864 if (Target->IsAlive())
18865 TagUnitMap.push_back(Target);
18866
18867 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18868 {
18869 if (Unit* pet = *iterator)
18870 if (pet->IsGuardian() && pet->IsAlive())
18871 TagUnitMap.push_back(pet);
18872 }
18873 }
18874 }
18875 }
18876 else
18877 {
18878 if (owner->IsAlive())
18879 TagUnitMap.push_back(owner);
18880
18881 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18882 {
18883 if (Unit* pet = *itr)
18884 if (pet->IsGuardian() && pet->IsAlive())
18885 TagUnitMap.push_back(pet);
18886 }
18887 }
18888}
uint8 GetSubGroup() const
Definition Player.h:2476

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19066{
19067 uint32 currentPhase = 0;
19069 if (!phases.empty())
19070 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19071 currentPhase |= (*itr)->GetMiscValue();
19072
19073 return currentPhase;
19074}
@ SPELL_AURA_PHASE
Definition SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1044{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1097{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), boss_shade_of_aran::JustEngagedWith(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1099{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1098
uint32 GetPower(Powers power) const
Definition Unit.h:1097

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15432{
15433 switch (unitMod)
15434 {
15435 case UNIT_MOD_RAGE:
15436 return POWER_RAGE;
15437 case UNIT_MOD_FOCUS:
15438 return POWER_FOCUS;
15439 case UNIT_MOD_ENERGY:
15440 return POWER_ENERGY;
15441 case UNIT_MOD_HAPPINESS:
15442 return POWER_HAPPINESS;
15443 case UNIT_MOD_RUNE:
15444 return POWER_RUNE;
15446 return POWER_RUNIC_POWER;
15447 default:
15448 case UNIT_MOD_MANA:
15449 return POWER_MANA;
15450 }
15451}
@ UNIT_MOD_RUNE
Definition Unit.h:156
@ UNIT_MOD_ENERGY
Definition Unit.h:154
@ UNIT_MOD_FOCUS
Definition Unit.h:153
@ UNIT_MOD_HAPPINESS
Definition Unit.h:155
@ UNIT_MOD_MANA
Definition Unit.h:151
@ UNIT_MOD_RAGE
Definition Unit.h:152
@ UNIT_MOD_RUNIC_POWER
Definition Unit.h:157

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13527{
13528 // proc per minute chance calculation
13529 if (PPM <= 0)
13530 return 0.0f;
13531
13532 // Apply chance modifer aura
13533 if (spellProto)
13534 if (Player* modOwner = GetSpellModOwner())
13535 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13536
13537 return (WeaponSpeed * PPM) / 600.0f; // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13538}
@ SPELLMOD_PROC_PER_MINUTE
Definition SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16521{
16522 // use provided list of auras which can proc
16523 if (procAuras)
16524 {
16525 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16526 {
16527 ASSERT((*itr)->GetTarget() == this);
16528 if (!(*itr)->GetRemoveMode())
16529 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16530 {
16531 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16532 aurasTriggeringProc.push_back(*itr);
16533 }
16534 }
16535 }
16536 // or generate one on our own
16537 else
16538 {
16539 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16540 {
16541 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16542 {
16543 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16544 aurasTriggeringProc.push_back(itr->second);
16545 }
16546 }
16547 }
16548}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
20885{
20886 if (IsPlayer())
20887 {
20888 if (original)
20889 return m_realRace;
20890 else
20891 return m_race;
20892 }
20893
20895}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CheckSkillLearnedBySpell(), Player::CreateCorpse(), GetModelForForm(), ObjectMgr::GetModelForShapeshift(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), InstanceScript::OnPlayerLeave(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
715{
716 float combat_reach = GetCombatReach();
717 if (combat_reach < 0.1f) // sometimes bugged for players
718 combat_reach = DEFAULT_COMBAT_REACH;
719
720 uint32 attacker_number = getAttackers().size();
721 if (attacker_number > 0)
722 --attacker_number;
723 Creature const* c = obj->ToCreature();
724 if (c)
725 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
726 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
727
728 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
729 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
730
731 // pussywizard
732 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
733 {
734 x = this->GetPositionX();
735 y = this->GetPositionY();
736 z = this->GetPositionZ();
737 obj->UpdateAllowedPositionZ(x, y, z);
738 }
739 float maxDist = GetMeleeRange(obj);
740 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
741 {
742 if (force)
743 {
744 x = this->GetPositionX();
745 y = this->GetPositionY();
746 z = this->GetPositionZ();
747 return true;
748 }
749 return false;
750 }
751 return true;
752}
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:45
bool IsDungeonBoss() const
Definition Creature.cpp:3180
bool isControlled() const
Definition Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:20984
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:683
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition Object.cpp:1359
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:174

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10116{
10117 // always friendly to self
10118 if (this == target)
10119 return REP_FRIENDLY;
10120
10121 // always friendly to charmer or owner
10123 return REP_FRIENDLY;
10124
10125 Player const* selfPlayerOwner = GetAffectingPlayer();
10126 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10127
10128 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10129 if (selfPlayerOwner)
10130 {
10131 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10132 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10133 return *repRank;
10134 }
10135 else if (targetPlayerOwner)
10136 {
10137 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10138 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10139 return *repRank;
10140 }
10141
10143 {
10144 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10145 {
10146 if (selfPlayerOwner && targetPlayerOwner)
10147 {
10148 // always friendly to other unit controlled by player, or to the player himself
10149 if (selfPlayerOwner == targetPlayerOwner)
10150 return REP_FRIENDLY;
10151
10152 // duel - always hostile to opponent
10153 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10154 return REP_HOSTILE;
10155
10156 // same group - checks dependant only on our faction - skip FFA_PVP for example
10157 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10158 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10159 // however client seems to allow mixed group parties, because in 13850 client it works like:
10160 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10161 }
10162
10163 // check FFA_PVP
10164 if (IsFFAPvP() && target->IsFFAPvP())
10165 return REP_HOSTILE;
10166
10167 if (selfPlayerOwner)
10168 {
10169 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10170 {
10171 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10172 return *repRank;
10173 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10174 {
10175 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10176 {
10177 if (targetFactionEntry->CanHaveReputation())
10178 {
10179 // check contested flags
10180 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10181 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10182 return REP_HOSTILE;
10183
10184 // if faction has reputation, hostile state depends only from AtWar state
10185 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10186 return REP_HOSTILE;
10187 return REP_FRIENDLY;
10188 }
10189 }
10190 }
10191 }
10192 }
10193 }
10194 }
10195
10196 ReputationRank repRank = REP_HATED;
10197 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10198 {
10199 return ReputationRank(repRank);
10200 }
10201
10202 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10203 if (checkOriginalFaction)
10204 {
10205 if (IsPlayer())
10206 {
10207 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10208 {
10209 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10210 }
10211 }
10212 else
10213 {
10214 Unit* owner = GetOwner();
10215 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10216 {
10217 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10218 }
10219 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10220 {
10221 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10222 }
10223 }
10224 }
10225
10226 if (!factionTemplateEntry)
10227 {
10228 factionTemplateEntry = GetFactionTemplateEntry();
10229 }
10230
10231 // do checks dependant only on our faction
10232 return GetFactionReactionTo(factionTemplateEntry, target);
10233}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1110
bool IsAtWar(uint32 faction_id) const
Definition ReputationMgr.cpp:55
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition Unit.cpp:10235
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:18824
Definition DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20095{
20096 int32 resist = -1;
20097 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20098 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20099 resist = int32(GetResistance(SpellSchools(i)));
20100
20101 // resist value will never be negative here
20102 return uint32(resist);
20103}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1160{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition UnitDefines.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1139 {
1140 uint32 value = GetShieldBlockValue();
1141 if (value >= hard_cap)
1142 {
1143 value = (soft_cap + hard_cap) / 2;
1144 }
1145 else if (value > soft_cap)
1146 {
1147 value = soft_cap + ((value - soft_cap) / 2);
1148 }
1149
1150 return value;
1151 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1393{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

float Unit::GetSpeed ( UnitMoveType  mtype) const

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15173{
15174 if (!spellInfo->RangeEntry)
15175 {
15176 return 0;
15177 }
15178
15179 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15180 {
15181 return spellInfo->GetMaxRange();
15182 }
15183
15184 if (!target)
15185 {
15186 return spellInfo->GetMaxRange(true);
15187 }
15188
15189 return spellInfo->GetMaxRange(!IsHostileTo(target));
15190}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15193{
15194 if (!spellInfo->RangeEntry)
15195 {
15196 return 0;
15197 }
15198
15199 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15200 {
15201 return spellInfo->GetMinRange();
15202 }
15203
15204 return spellInfo->GetMinRange(!IsHostileTo(target));
15205}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16585{
16586 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16587 {
16588 return player;
16589 }
16590
16591 if (Unit* owner = GetOwner())
16592 {
16593 if (Player* player = owner->ToPlayer())
16594 {
16595 return player;
16596 }
16597 }
16598
16599 // Special handling for Eye of Kilrogg
16601 {
16602 if (TempSummon const* tempSummon = ToTempSummon())
16603 {
16604 if (Unit* summoner = tempSummon->GetSummonerUnit())
16605 {
16606 return summoner->ToPlayer();
16607 }
16608 }
16609 }
16610
16611 return nullptr;
16612}
@ NPC_EYE_OF_KILROGG
Definition PetDefines.h:102
Definition TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), SpellHealingBonusTaken(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15371{
15373
15374 switch (unitMod)
15375 {
15377 school = SPELL_SCHOOL_HOLY;
15378 break;
15380 school = SPELL_SCHOOL_FIRE;
15381 break;
15383 school = SPELL_SCHOOL_NATURE;
15384 break;
15386 school = SPELL_SCHOOL_FROST;
15387 break;
15389 school = SPELL_SCHOOL_SHADOW;
15390 break;
15392 school = SPELL_SCHOOL_ARCANE;
15393 break;
15394
15395 default:
15396 break;
15397 }
15398
15399 return school;
15400}
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:299
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:297
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:298
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:296
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:295
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:163
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:162
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:159
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:164
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:160
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:161

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15403{
15404 Stats stat = STAT_STRENGTH;
15405
15406 switch (unitMod)
15407 {
15409 stat = STAT_STRENGTH;
15410 break;
15412 stat = STAT_AGILITY;
15413 break;
15415 stat = STAT_STAMINA;
15416 break;
15418 stat = STAT_INTELLECT;
15419 break;
15421 stat = STAT_SPIRIT;
15422 break;
15423
15424 default:
15425 break;
15426 }
15427
15428 return stat;
15429}
Stats
Definition SharedDefines.h:268
@ STAT_SPIRIT
Definition SharedDefines.h:273
@ STAT_INTELLECT
Definition SharedDefines.h:272
@ STAT_AGILITY
Definition SharedDefines.h:270
@ STAT_STRENGTH
Definition SharedDefines.h:269
@ STAT_STAMINA
Definition SharedDefines.h:271
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:148
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:149
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:145
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:146
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:147

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
936{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), spell_black_knight_ghoul_claw::HandleSpellHit(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_eck::boss_eckAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_molten_golem::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
937{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15454{
15455 if (attType == RANGED_ATTACK)
15456 {
15458 if (victim)
15459 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15460
15461 if (ap < 0)
15462 return 0.0f;
15464 }
15465 else
15466 {
15468 if (victim)
15469 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15470
15471 if (ap < 0)
15472 return 0.0f;
15474 }
15475}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:288

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5990{
5991 int32 modifier = 0;
5992 int32 areaModifier = 0;
5993
5994 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5995 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5996 {
5997 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5998 {
5999 if (areaModifier < (*i)->GetAmount())
6000 areaModifier = (*i)->GetAmount();
6001 }
6002 else
6003 modifier += (*i)->GetAmount();
6004 }
6005
6006 return modifier + areaModifier;
6007}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6166{
6167 int32 modifier = 0;
6168
6169 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6170 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6171 if ((*i)->IsAffectedOnSpell(affectedSpell))
6172 modifier += (*i)->GetAmount();
6173
6174 return modifier;
6175}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6061{
6062 int32 modifier = 0;
6063
6064 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6065 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6066 {
6067 if ((*i)->GetMiscValue()& misc_mask)
6068 modifier += (*i)->GetAmount();
6069 }
6070 return modifier;
6071}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6114{
6115 int32 modifier = 0;
6116
6117 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6118 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6119 if ((*i)->GetMiscValue() == misc_value)
6120 modifier += (*i)->GetAmount();
6121
6122 return modifier;
6123}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15344{
15345 if (unitMod >= UNIT_MOD_END)
15346 {
15347 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15348 return 0.0f;
15349 }
15350
15351 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15352 return 0.0f;
15353
15354 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15355 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15356 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15357 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15358
15359 return value;
15360}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
6024{
6025 float multiplier = 1.0f;
6026
6027 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6028 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6029 AddPct(multiplier, (*i)->GetAmount());
6030
6031 return multiplier;
6032}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6178{
6179 float multiplier = 1.0f;
6180
6181 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6182 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6183 if ((*i)->IsAffectedOnSpell(affectedSpell))
6184 AddPct(multiplier, (*i)->GetAmount());
6185
6186 return multiplier;
6187}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6074{
6075 float multiplier = 1.0f;
6076
6077 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6078 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6079 if (((*i)->GetMiscValue() & misc_mask))
6080 AddPct(multiplier, (*i)->GetAmount());
6081
6082 return multiplier;
6083}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6126{
6127 float multiplier = 1.0f;
6128
6129 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6130 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6131 if ((*i)->GetMiscValue() == misc_value)
6132 AddPct(multiplier, (*i)->GetAmount());
6133
6134 return multiplier;
6135}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15328{
15329 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15330
15331 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15332 return 0.0f;
15333
15334 // value = ((base_value * base_pct) + total_value) * total_pct
15335 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15336 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15337 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15338 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15339
15340 return value;
15341}
UnitMods
Definition Unit.h:144
@ UNIT_MOD_STAT_START
Definition Unit.h:172
float GetCreateStat(Stats stat) const
Definition Unit.h:1041

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3740{
3741 if (Player const* player = ToPlayer())
3742 {
3743 if (player->CanBlock())
3744 {
3745 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3746 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3748 }
3749 // is player but has no block ability or no not broken shield equipped
3750 return 0.0f;
3751 }
3752 else
3753 {
3754 if (ToCreature()->IsTotem())
3755 return 0.0f;
3756 else
3757 {
3758 float block = 5.0f;
3760 return block > 0.0f ? block : 0.0f;
3761 }
3762 }
3763}
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:686
#define INVENTORY_SLOT_BAG_0
Definition Player.h:665
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
bool IsBroken() const
Definition Item.h:257
uint32 Block
Definition ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3766{
3767 float crit;
3768
3769 if (IsPlayer())
3770 {
3771 switch (attackType)
3772 {
3773 case BASE_ATTACK:
3775 break;
3776 case OFF_ATTACK:
3778 break;
3779 case RANGED_ATTACK:
3781 break;
3782 // Just for good manner
3783 default:
3784 crit = 0.0f;
3785 break;
3786 }
3787 }
3788 else
3789 {
3790 crit = 5.0f;
3793 }
3794
3795 // flat aura mods
3796 if (attackType == RANGED_ATTACK)
3797 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3798 else
3799 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3800
3801 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3802 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3803 {
3804 if (GetGUID() != (*i)->GetCasterGUID())
3805 continue;
3806
3807 crit += (*i)->GetAmount();
3808 }
3809
3810 // reduce crit chance from Rating for players
3811 if (attackType != RANGED_ATTACK)
3812 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3813 else
3814 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3815
3816 // Apply crit chance from defence skill
3817 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3818
3819 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3820 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3821
3822 if (crit < 0.0f)
3823 crit = 0.0f;
3824 return crit;
3825}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1171

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3678{
3679 if (IsPlayer())
3680 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3681 else
3682 {
3683 if (ToCreature()->IsTotem())
3684 return 0.0f;
3685 else
3686 {
3687 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3689 return dodge > 0.0f ? dodge : 0.0f;
3690 }
3691 }
3692}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
float GetRealDodge() const
Definition Player.h:2608

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition UnitDefines.h:291
@ UNIT_FIELD_FLAGS_2
Definition UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1153{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3725{
3726 float miss_chance = 5.00f;
3727
3728 if (Player const* player = ToPlayer())
3729 miss_chance += player->GetMissPercentageFromDefence();
3730
3731 if (attType == RANGED_ATTACK)
3733 else
3735
3736 return miss_chance;
3737}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3695{
3696 float chance = 0.0f;
3697
3698 if (Player const* player = ToPlayer())
3699 {
3700 if (player->CanParry())
3701 {
3702 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3703 if (!tmpitem)
3704 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3705
3706 if (tmpitem)
3707 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3708 }
3709 }
3710 else if (IsCreature())
3711 {
3712 if (ToCreature()->isWorldBoss())
3713 chance = 13.4f; // + 0.6 by skill diff
3715 chance = 5.0f;
3716
3717 // Xinef: if aura is present, type should not matter
3719 }
3720
3721 return chance > 0.0f ? chance : 0.0f;
3722}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
728{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1880{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMoverRelocation(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1879{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
886{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), Attack(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_isalien::DamageTaken(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), SmartAI::DistanceYourself(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), spell_mirkblood_blood_mirror_target_picker::HandleHit(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_attumen::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_shade_of_aran::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_taldaram::ScheduleCombatEvents(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMovement(), SetConfused(), SmartAI::SetCurrentRangeMode(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21046{
21047 if (slot >= MAX_EQUIPMENT_ITEMS)
21048 return 0;
21049
21051}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1500 {
1501 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1502 if (itr != m_visibleAuras.end())
1503 return itr->second;
1504 return nullptr;
1505 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15478{
15479 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15480 return 0.0f;
15481
15482 return m_weaponDamage[attType][type][damageIndex];
15483}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13516{
13517 // normalized proc chance for weapon attack speed
13518 // (odd formula...)
13520 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13522 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13523 return 0;
13524}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3828{
3829 uint32 value = 0;
3830 if (Player const* player = ToPlayer())
3831 {
3832 Item* item = player->GetWeaponForAttack(attType, true);
3833
3834 // feral or unarmed skill only for base attack
3835 if (attType != BASE_ATTACK && !item)
3836 return 0;
3837
3838 if (IsInFeralForm())
3839 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3840
3841 // weapon skill or (unarmed for base attack)
3842 uint32 skill = SKILL_UNARMED;
3843 if (item)
3844 skill = item->GetSkill();
3845
3846 // in PvP use full skill instead current skill value
3847 value = (target && target->IsControlledByPlayer())
3848 ? player->GetMaxSkillValue(skill)
3849 : player->GetSkillValue(skill);
3850 // Modify value from ratings
3851 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3852 switch (attType)
3853 {
3854 case BASE_ATTACK:
3855 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3856 break;
3857 case OFF_ATTACK:
3858 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3859 break;
3860 case RANGED_ATTACK:
3861 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3862 break;
3863 default:
3864 break;
3865 }
3866 }
3867 else
3868 value = GetUnitMeleeSkill(target);
3869 return value;
3870}
@ SKILL_UNARMED
Definition SharedDefines.h:3157
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:241
@ CR_WEAPON_SKILL
Definition Unit.h:219
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:240
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:239
uint32 GetSkill()
Definition Item.cpp:555
bool IsInFeralForm() const
Definition Unit.h:1914

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8815{
8816 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8817
8818 switch (dummySpell->SpellFamilyName)
8819 {
8821 switch (dummySpell->Id)
8822 {
8823 // Nevermelting Ice Crystal
8824 case 71564:
8825 RemoveAuraFromStack(71564);
8826 *handled = true;
8827 break;
8828 // Gaseous Bloat
8829 case 70672:
8830 case 72455:
8831 case 72832:
8832 case 72833:
8833 {
8834 if (Unit* caster = triggeredByAura->GetCaster())
8835 if (victim && caster->GetGUID() == victim->GetGUID())
8836 {
8837 *handled = true;
8838 uint32 stack = triggeredByAura->GetStackAmount();
8839 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8840 int32 dmg = 0;
8841 for (uint8 i = 1; i <= stack; ++i)
8842 dmg += mod * i;
8843 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8844 }
8845 break;
8846 }
8847 // Ball of Flames Proc
8848 case 71756:
8849 case 72782:
8850 case 72783:
8851 case 72784:
8852 RemoveAuraFromStack(dummySpell->Id);
8853 *handled = true;
8854 break;
8855 // Discerning Eye of the Beast
8856 case 59915:
8857 {
8858 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8859 *handled = true;
8860 break;
8861 }
8862 // Swift Hand of Justice
8863 case 59906:
8864 {
8865 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8866 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8867 *handled = true;
8868 break;
8869 }
8870 }
8871
8872 break;
8873 case SPELLFAMILY_MAGE:
8874 {
8875 // Combustion
8876 switch (dummySpell->Id)
8877 {
8878 case 11129:
8879 {
8880 *handled = true;
8881 Unit* caster = triggeredByAura->GetCaster();
8882 if (!caster || !damage)
8883 return false;
8884
8885 // last charge and crit
8886 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8887 return true; // charge counting (will removed)
8888
8889 CastSpell(this, 28682, true);
8890
8891 return procEx & PROC_EX_CRITICAL_HIT;
8892 }
8893 // Empowered Fire
8894 case 31656:
8895 case 31657:
8896 case 31658:
8897 {
8898 *handled = true;
8899
8900 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8901 if (!spInfo)
8902 return false;
8903
8904 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8905 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8906 return true;
8907 }
8908 }
8909 break;
8910 }
8912 {
8913 // Blood of the North
8914 // Reaping
8915 // Death Rune Mastery
8916 // xinef: Icon 22 is used for item bonus, skip
8917 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8918 {
8919 *handled = true;
8920 // Convert recently used Blood Rune to Death Rune
8921 if (Player* player = ToPlayer())
8922 {
8923 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8924 return false;
8925
8926 // xinef: not true
8927 //RuneType rune = ToPlayer()->GetLastUsedRune();
8928 // can't proc from death rune use
8929 //if (rune == RUNE_DEATH)
8930 // return false;
8931 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8932 if (!aurEff)
8933 return false;
8934
8935 // Reset amplitude - set death rune remove timer to 30s
8936 aurEff->ResetPeriodic(true);
8937 uint32 runesLeft;
8938
8939 if (dummySpell->SpellIconID == 2622)
8940 runesLeft = 2;
8941 else
8942 runesLeft = 1;
8943
8944 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8945 {
8946 if (dummySpell->SpellIconID == 2622)
8947 {
8948 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8949 player->GetBaseRune(i) == RUNE_BLOOD)
8950 continue;
8951 }
8952 else
8953 {
8954 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8955 player->GetBaseRune(i) != RUNE_BLOOD)
8956 continue;
8957 }
8958 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8959 continue;
8960
8961 --runesLeft;
8962 // Mark aura as used
8963 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8964 }
8965 return true;
8966 }
8967 return false;
8968 }
8969 break;
8970 }
8972 {
8973 switch (dummySpell->Id)
8974 {
8975 // Item - Warrior T10 Protection 4P Bonus
8976 case 70844:
8977 {
8978 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8979 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8980 break;
8981 }
8982 default:
8983 break;
8984 }
8985 break;
8986 }
8987 case SPELLFAMILY_SHAMAN:
8988 {
8989 // Flurry
8990 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8991 {
8992 if (cooldown)
8993 {
8994 if (HasSpellCooldown(dummySpell->Id))
8995 {
8996 *handled = true;
8997 break;
8998 }
8999
9000 AddSpellCooldown(dummySpell->Id, 0, cooldown);
9001 }
9002 }
9003 break;
9004 }
9005 }
9006 return false;
9007}
@ RUNE_DEATH
Definition Player.h:408
@ RUNE_BLOOD
Definition Player.h:405
@ EFFECT_1
Definition SharedDefines.h:32
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3797
@ SPELLFAMILY_GENERIC
Definition SharedDefines.h:3794
@ SPELLFAMILY_WARRIOR
Definition SharedDefines.h:3798
@ SPELLFAMILY_SHAMAN
Definition SharedDefines.h:3805
@ SPELLFAMILY_DEATHKNIGHT
Definition SharedDefines.h:3809
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:175
uint8 GetSpawnMode() const
Definition Map.h:267
virtual bool HasSpellCooldown(uint32) const
Definition Unit.h:1302
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Unit.h:1304
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4993

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17688{
17689 // aura can be deleted at casts
17690 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17691
17692 uint32 damageSpellId;
17693 switch (spellProto->Id)
17694 {
17695 case 57949: // shiver
17696 damageSpellId = 57952;
17697 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17698 break;
17699 case 59978: // shiver
17700 damageSpellId = 59979;
17701 break;
17702 case 43593: // Cold Stare
17703 damageSpellId = 43594;
17704 break;
17705 default:
17706 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17707 return false;
17708 }
17709
17710 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17711
17712 // jumps
17713 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17714
17715 // current aura expire
17716 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17717
17718 // next target selection
17719 if (jumps > 0)
17720 {
17721 if (Unit* caster = triggeredByAura->GetCaster())
17722 {
17723 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17724 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17725 {
17726 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17727 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17728 aura->SetCharges(jumps);
17729 }
17730 }
17731 }
17732
17733 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17734
17735 return true;
17736}
void SetCharges(uint8 charges)
Definition SpellAuras.cpp:952
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition Unit.cpp:11190

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17599{
17600 // aura can be deleted at casts
17601 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17602 int32 heal = triggeredByAura->GetAmount();
17603 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17604
17605 // Currently only Prayer of Mending
17606 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17607 {
17608 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17609 return false;
17610 }
17611
17612 // jumps
17613 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17614
17615 // current aura expire
17616 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17617
17618 // next target selection
17619 if (jumps > 0)
17620 {
17621 if (Unit* caster = triggeredByAura->GetCaster())
17622 {
17623 // smart healing
17624 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17625 std::list<Unit*> nearMembers;
17626
17627 Player* player = nullptr;
17628 if (IsPlayer())
17629 player = ToPlayer();
17630 else if (GetOwner())
17631 player = GetOwner()->ToPlayer();
17632
17633 if (player)
17634 {
17635 Group* group = player->GetGroup();
17636 if (!group)
17637 {
17638 if (player != this)
17639 {
17640 if (IsWithinDistInMap(player, radius))
17641 nearMembers.push_back(player);
17642 }
17643 else if (Unit* pet = GetGuardianPet())
17644 {
17645 if (IsWithinDistInMap(pet, radius))
17646 nearMembers.push_back(pet);
17647 }
17648 }
17649 else
17650 {
17651 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17652 if (Player* Target = itr->GetSource())
17653 {
17654 if (Target != this && !IsWithinDistInMap(Target, radius))
17655 continue;
17656
17657 // IsHostileTo check duel and controlled by enemy
17658 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17659 nearMembers.push_back(Target);
17660
17661 // Push player's pet to vector
17662 if (Unit* pet = Target->GetGuardianPet())
17663 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17664 nearMembers.push_back(pet);
17665 }
17666 }
17667
17668 if (!nearMembers.empty())
17669 {
17670 nearMembers.sort(Acore::HealthPctOrderPred());
17671 if (Unit* target = nearMembers.front())
17672 {
17673 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17674 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17675 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17676 aura->SetCharges(jumps);
17677 }
17678 }
17679 }
17680 }
17681 }
17682
17683 // heal
17684 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17685 return true;
17686}
@ SPELLFAMILY_PRIEST
Definition SharedDefines.h:3800
Definition Unit.h:2251

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6689{
6690 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6691 uint32 effIndex = triggeredByAura->GetEffIndex();
6692 int32 triggerAmount = triggeredByAura->GetAmount();
6693 Spell const* spellProc = eventInfo.GetProcSpell();
6694
6695 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6696 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6697
6698 uint32 triggered_spell_id = 0;
6699 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6700 // otherwise, it's the triggered_spell_id by default
6701 Unit* target = victim;
6702 int32 basepoints0 = 0;
6703 ObjectGuid originalCaster;
6704
6705 switch (dummySpell->SpellFamilyName)
6706 {
6708 {
6709 switch (dummySpell->Id)
6710 {
6711 // Overkill
6712 case 58426:
6713 {
6714 triggered_spell_id = 58427;
6715 break;
6716 }
6717 // Unstable Power
6718 case 24658:
6719 {
6720 if (!procSpell || procSpell->Id == 24659)
6721 return false;
6722 // Need remove one 24659 aura
6723 RemoveAuraFromStack(24659);
6724 return true;
6725 }
6726 // Restless Strength
6727 case 24661:
6728 {
6729 // Need remove one 24662 aura
6730 RemoveAuraFromStack(24662);
6731 return true;
6732 }
6733 // Mark of Malice
6734 case 33493:
6735 {
6736 if (triggeredByAura->GetBase()->GetCharges() > 1)
6737 return true;
6738
6739 target = this;
6740 triggered_spell_id = 33494;
6741 break;
6742 }
6743 // Twisted Reflection (boss spell)
6744 case 21063:
6745 triggered_spell_id = 21064;
6746 break;
6747 // Vampiric Aura (boss spell)
6748 case 38196:
6749 {
6750 basepoints0 = 3 * damage; // 300%
6751 if (basepoints0 < 0)
6752 return false;
6753
6754 triggered_spell_id = 31285;
6755 target = this;
6756 break;
6757 }
6758 // Aura of Madness (Darkmoon Card: Madness trinket)
6759 //=====================================================
6760 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6761 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6762 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6763 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6764 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6765 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6766 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6767 // 41011 Martyr Complex: +35 stamina (All classes)
6768 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6769 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6770 case 39446:
6771 {
6772 if (!IsPlayer() || !IsAlive())
6773 return false;
6774
6775 // Select class defined buff
6776 switch (getClass())
6777 {
6778 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6779 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6780 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6781 cooldown_spell_id = 39511;
6782 break;
6783 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6784 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6785 case CLASS_DEATH_KNIGHT:
6786 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6787 cooldown_spell_id = 39511;
6788 break;
6789 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6790 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6791 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6792 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6793 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6794 cooldown_spell_id = 40999;
6795 break;
6796 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6797 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6798 cooldown_spell_id = 40997;
6799 break;
6800 default:
6801 return false;
6802 }
6803
6804 target = this;
6805 if (roll_chance_i(10))
6806 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6807 break;
6808 }
6809 // Sunwell Exalted Caster Neck (??? neck)
6810 // cast ??? Light's Wrath if Exalted by Aldor
6811 // cast ??? Arcane Bolt if Exalted by Scryers
6812 case 46569:
6813 return false; // old unused version
6814 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6815 // cast 45479 Light's Wrath if Exalted by Aldor
6816 // cast 45429 Arcane Bolt if Exalted by Scryers
6817 case 45481:
6818 {
6819 Player* player = ToPlayer();
6820 if (!player)
6821 return false;
6822
6823 // Get Aldor reputation rank
6824 if (player->GetReputationRank(932) == REP_EXALTED)
6825 {
6826 target = this;
6827 triggered_spell_id = 45479;
6828 break;
6829 }
6830 // Get Scryers reputation rank
6831 if (player->GetReputationRank(934) == REP_EXALTED)
6832 {
6833 // triggered at positive/self casts also, current attack target used then
6834 if (target && IsFriendlyTo(target))
6835 {
6836 target = GetVictim();
6837 if (!target)
6838 {
6839 target = player->GetSelectedUnit();
6840 if (!target)
6841 return false;
6842 }
6843 if (IsFriendlyTo(target))
6844 return false;
6845 }
6846
6847 triggered_spell_id = 45429;
6848 break;
6849 }
6850 return false;
6851 }
6852 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6853 // cast 45480 Light's Strength if Exalted by Aldor
6854 // cast 45428 Arcane Strike if Exalted by Scryers
6855 case 45482:
6856 {
6857 if (!IsPlayer())
6858 return false;
6859
6860 // Get Aldor reputation rank
6861 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6862 {
6863 target = this;
6864 triggered_spell_id = 45480;
6865 break;
6866 }
6867 // Get Scryers reputation rank
6868 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6869 {
6870 triggered_spell_id = 45428;
6871 break;
6872 }
6873 return false;
6874 }
6875 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6876 // cast 45431 Arcane Insight if Exalted by Aldor
6877 // cast 45432 Light's Ward if Exalted by Scryers
6878 case 45483:
6879 {
6880 if (!IsPlayer())
6881 return false;
6882
6883 // Get Aldor reputation rank
6884 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6885 {
6886 target = this;
6887 triggered_spell_id = 45432;
6888 break;
6889 }
6890 // Get Scryers reputation rank
6891 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6892 {
6893 target = this;
6894 triggered_spell_id = 45431;
6895 break;
6896 }
6897 return false;
6898 }
6899 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6900 // cast 45478 Light's Salvation if Exalted by Aldor
6901 // cast 45430 Arcane Surge if Exalted by Scryers
6902 case 45484:
6903 {
6904 if (!IsPlayer())
6905 return false;
6906
6907 // Get Aldor reputation rank
6908 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6909 {
6910 target = this;
6911 triggered_spell_id = 45478;
6912 break;
6913 }
6914 // Get Scryers reputation rank
6915 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6916 {
6917 triggered_spell_id = 45430;
6918 break;
6919 }
6920 return false;
6921 }
6922 // Kill command
6923 case 58914:
6924 {
6925 // Remove aura stack from pet
6926 RemoveAuraFromStack(58914);
6927 Unit* owner = GetOwner();
6928 if (!owner)
6929 return true;
6930 // reduce the owner's aura stack
6931 owner->RemoveAuraFromStack(34027);
6932 return true;
6933 }
6934 // Vampiric Touch (generic, used by some boss)
6935 case 52723:
6936 case 60501:
6937 {
6938 triggered_spell_id = 52724;
6939 basepoints0 = damage / 2;
6940 target = this;
6941 break;
6942 }
6943 // Divine purpose
6944 case 31871:
6945 case 31872:
6946 {
6947 // Roll chane
6948 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6949 return false;
6950
6951 // Remove any stun effect on target
6953 return true;
6954 }
6955 // Glyph of Life Tap
6956 case 63320:
6957 {
6958 triggered_spell_id = 63321; // Life Tap
6959 break;
6960 }
6961 case 71519: // Deathbringer's Will Normal
6962 {
6963 if (!IsPlayer() || HasSpellCooldown(71484))
6964 return false;
6965
6966 AddSpellCooldown(71484, 0, cooldown);
6967
6968 std::vector<uint32> RandomSpells;
6969 switch (getClass())
6970 {
6971 case CLASS_WARRIOR:
6972 case CLASS_PALADIN:
6973 case CLASS_DEATH_KNIGHT:
6974 RandomSpells.push_back(71484);
6975 RandomSpells.push_back(71491);
6976 RandomSpells.push_back(71492);
6977 break;
6978 case CLASS_SHAMAN:
6979 case CLASS_ROGUE:
6980 RandomSpells.push_back(71486);
6981 RandomSpells.push_back(71485);
6982 RandomSpells.push_back(71492);
6983 break;
6984 case CLASS_DRUID:
6985 RandomSpells.push_back(71484);
6986 RandomSpells.push_back(71485);
6987 RandomSpells.push_back(71492);
6988 break;
6989 case CLASS_HUNTER:
6990 RandomSpells.push_back(71486);
6991 RandomSpells.push_back(71491);
6992 RandomSpells.push_back(71485);
6993 break;
6994 default:
6995 return false;
6996 }
6997 if (RandomSpells.empty()) // shouldn't happen
6998 return false;
6999
7000 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7001 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7002 break;
7003 }
7004 case 71562: // Deathbringer's Will Heroic
7005 {
7006 if (!IsPlayer() || HasSpellCooldown(71561))
7007 return false;
7008
7009 AddSpellCooldown(71561, 0, cooldown);
7010
7011 std::vector<uint32> RandomSpells;
7012 switch (getClass())
7013 {
7014 case CLASS_WARRIOR:
7015 case CLASS_PALADIN:
7016 case CLASS_DEATH_KNIGHT:
7017 RandomSpells.push_back(71561);
7018 RandomSpells.push_back(71559);
7019 RandomSpells.push_back(71560);
7020 break;
7021 case CLASS_SHAMAN:
7022 case CLASS_ROGUE:
7023 RandomSpells.push_back(71558);
7024 RandomSpells.push_back(71556);
7025 RandomSpells.push_back(71560);
7026 break;
7027 case CLASS_DRUID:
7028 RandomSpells.push_back(71561);
7029 RandomSpells.push_back(71556);
7030 RandomSpells.push_back(71560);
7031 break;
7032 case CLASS_HUNTER:
7033 RandomSpells.push_back(71558);
7034 RandomSpells.push_back(71559);
7035 RandomSpells.push_back(71556);
7036 break;
7037 default:
7038 return false;
7039 }
7040 if (RandomSpells.empty()) // shouldn't happen
7041 return false;
7042
7043 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7044 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7045 break;
7046 }
7047 // Freya, Petrified Bark
7048 case 62933:
7049 case 62337:
7050 {
7051 if (!victim)
7052 return false;
7053
7054 int32 dmg = damage;
7055 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
7056 return true;
7057 }
7058 // Trial of the Champion, Earth Shield
7059 case 67534:
7060 {
7061 const int32 dmg = (int32)damage;
7062 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
7063 return true;
7064 }
7065 // Trial of the Crusader, Faction Champions, Retaliation
7066 case 65932:
7067 {
7068 // check attack comes not from behind
7069 if (!victim || !HasInArc(M_PI, victim))
7070 return false;
7071
7072 triggered_spell_id = 65934;
7073 break;
7074 }
7075 // Pit of Saron, Tyrannus, Overlord's Brand
7076 case 69172: // everything except for DoTs
7077 {
7078 if (!target)
7079 return false;
7080 if (Unit* caster = triggeredByAura->GetCaster())
7081 {
7083 {
7084 int32 dmg = 5.5f * damage;
7085 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7086 }
7087 else
7088 {
7089 if (caster->GetVictim())
7090 {
7091 int32 dmg = damage;
7092 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7093 }
7094 }
7095 }
7096 return true;
7097 }
7098 // Pit of Saron, Tyrannus, Overlord's Brand
7099 case 69173: // only DoTs
7100 {
7101 if (!target)
7102 return false;
7103 if (Unit* caster = triggeredByAura->GetCaster())
7104 {
7105 if (procEx & PROC_EX_INTERNAL_HOT)
7106 {
7107 int32 dmg = 5.5f * damage;
7108 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7109 }
7110 else
7111 {
7112 if (caster->GetVictim())
7113 {
7114 int32 dmg = damage;
7115 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7116 }
7117 }
7118 }
7119 return true;
7120 }
7121 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7122 case 70674:
7123 {
7124 if (Unit* caster = triggeredByAura->GetCaster())
7125 {
7126 int32 dmg = 3 * damage;
7127 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7128 }
7129 return true;
7130 }
7131 // Item: Purified Shard of the Gods
7132 case 69755:
7133 {
7134 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7135 break;
7136 }
7137 // Item: Shiny Shard of the Gods
7138 case 69739:
7139 {
7140 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7141 break;
7142 }
7143 // VoA: Meteor Fists koralon
7144 case 66725:
7145 case 68161:
7146 {
7147 triggered_spell_id = 66765; // handled by spell_difficulty
7148 break;
7149 }
7150 }
7151 break;
7152 }
7153 case SPELLFAMILY_MAGE:
7154 {
7155 // Magic Absorption
7156 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7157 {
7159 return false;
7160
7161 // mana reward
7162 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7163 target = this;
7164 triggered_spell_id = 29442;
7165 break;
7166 }
7167 // Hot Streak
7168 if (dummySpell->SpellIconID == 2999)
7169 {
7170 if (effIndex != 0)
7171 return false;
7172 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7173 if (!counter)
7174 return true;
7175
7176 // Count spell criticals in a row in second aura
7177 if (procEx & PROC_EX_CRITICAL_HIT)
7178 {
7179 counter->SetAmount(counter->GetAmount() * 2);
7180 if (counter->GetAmount() < 100) // not enough
7181 return true;
7182 // Crititcal counted -> roll chance
7183 if (roll_chance_i(triggerAmount))
7184 CastSpell(this, 48108, true, castItem, triggeredByAura);
7185 }
7186 counter->SetAmount(25);
7187 return true;
7188 }
7189 // Incanter's Regalia set (add trigger chance to Mana Shield)
7190 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7191 {
7192 if (!IsPlayer())
7193 return false;
7194
7195 target = this;
7196 triggered_spell_id = 37436;
7197 break;
7198 }
7199 switch (dummySpell->Id)
7200 {
7201 // Glyph of Polymorph
7202 case 56375:
7203 {
7204 if (!target)
7205 return false;
7206 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7209 return true;
7210 }
7211 // Glyph of Icy Veins
7212 case 56374:
7213 {
7216 return true;
7217 }
7218 // Glyph of Ice Block
7219 case 56372:
7220 {
7221 Player* player = ToPlayer();
7222 if (!player)
7223 return false;
7224
7225 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7226 // remove cooldowns on all ranks of Frost Nova
7227 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7228 {
7229 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7230 // Frost Nova
7231 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7232 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7233 player->RemoveSpellCooldown(cdSpell->Id, true);
7234 }
7235 break;
7236 }
7237 }
7238 break;
7239 }
7241 {
7242 // Second Wind
7243 if (dummySpell->SpellIconID == 1697)
7244 {
7245 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7246 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7247 return false;
7248 // Need stun or root mechanic
7249 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7250 return false;
7251
7252 switch (dummySpell->Id)
7253 {
7254 case 29838:
7255 triggered_spell_id = 29842;
7256 break;
7257 case 29834:
7258 triggered_spell_id = 29841;
7259 break;
7260 case 42770:
7261 triggered_spell_id = 42771;
7262 break;
7263 default:
7264 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7265 return false;
7266 }
7267
7268 target = this;
7269 break;
7270 }
7271 break;
7272 }
7274 {
7275 switch (dummySpell->Id)
7276 {
7277 // Nightfall
7278 case 18094:
7279 case 18095:
7280 // Glyph of corruption
7281 case 56218:
7282 {
7283 target = this;
7284 triggered_spell_id = 17941;
7285 break;
7286 }
7287 // Soul Leech
7288 case 30293:
7289 case 30295:
7290 case 30296:
7291 {
7292 // Improved Soul Leech
7293 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7294 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7295 {
7296 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7297 {
7298 if ((*i)->GetEffIndex() != 0)
7299 continue;
7300 basepoints0 = int32((*i)->GetAmount());
7301 target = GetGuardianPet();
7302 if (target)
7303 {
7304 // regen mana for pet
7305 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7306 }
7307 // regen mana for caster
7308 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7309 // Get second aura of spell for replenishment effect on party
7310 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7311 {
7312 // Replenishment - roll chance
7313 if (roll_chance_i(aurEff->GetAmount()))
7314 {
7315 CastSpell(this, 57669, true, castItem, triggeredByAura);
7316 }
7317 }
7318 break;
7319 }
7320 }
7321 // health
7322 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7323 target = this;
7324 triggered_spell_id = 30294;
7325 break;
7326 }
7327 // Shadowflame (Voidheart Raiment set bonus)
7328 case 37377:
7329 {
7330 triggered_spell_id = 37379;
7331 break;
7332 }
7333 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7334 case 37381:
7335 {
7336 target = GetGuardianPet();
7337 if (!target)
7338 return false;
7339
7340 // heal amount
7341 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7342 triggered_spell_id = 37382;
7343 break;
7344 }
7345 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7346 case 39437:
7347 {
7348 triggered_spell_id = 37378;
7349 break;
7350 }
7351 }
7352 break;
7353 }
7354 case SPELLFAMILY_PRIEST:
7355 {
7356 // Body and Soul
7357 if (dummySpell->SpellIconID == 2218)
7358 {
7359 // Proc only from Abolish desease on self cast
7360 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7361 return false;
7362 triggered_spell_id = 64136;
7363 target = this;
7364 break;
7365 }
7366 switch (dummySpell->Id)
7367 {
7368 // Vampiric Embrace
7369 case 15286:
7370 {
7371 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7372 return false;
7373
7374 // heal amount
7375 int32 total = CalculatePct(int32(damage), triggerAmount);
7376 int32 team = total / 5;
7377 int32 self = total - team;
7378 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7379 return true; // no hidden cooldown
7380 }
7381 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7382 case 40438:
7383 {
7384 // Shadow Word: Pain
7385 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7386 triggered_spell_id = 40441;
7387 // Renew
7388 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7389 triggered_spell_id = 40440;
7390 else
7391 return false;
7392
7393 target = this;
7394 break;
7395 }
7396 // Improved Shadowform
7397 case 47570:
7398 case 47569:
7399 {
7400 if (!roll_chance_i(triggerAmount))
7401 return false;
7402
7404 break;
7405 }
7406 // Glyph of Dispel Magic
7407 case 55677:
7408 {
7409 // Dispel Magic shares spellfamilyflag with abolish disease
7410 if (procSpell->SpellIconID != 74)
7411 return false;
7412 if (!target || !target->IsFriendlyTo(this))
7413 return false;
7414
7415 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7416 triggered_spell_id = 56131;
7417 break;
7418 }
7419 // Oracle Healing Bonus ("Garments of the Oracle" set)
7420 case 26169:
7421 {
7422 // heal amount
7423 basepoints0 = int32(CalculatePct(damage, 10));
7424 target = this;
7425 triggered_spell_id = 26170;
7426 break;
7427 }
7428 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7429 case 39372:
7430 {
7431 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7432 return false;
7433
7434 // heal amount
7435 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7436 target = this;
7437 triggered_spell_id = 39373;
7438 break;
7439 }
7440 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7441 case 28809:
7442 {
7443 triggered_spell_id = 28810;
7444 break;
7445 }
7446 // Priest T10 Healer 2P Bonus
7447 case 70770:
7448 // Flash Heal
7449 if (procSpell->SpellFamilyFlags[0] & 0x800)
7450 {
7451 triggered_spell_id = 70772;
7452 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7453 if (!blessHealing || !victim)
7454 return false;
7455 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7456 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7457 return true;
7458 }
7459 break;
7460 }
7461 break;
7462 }
7463 case SPELLFAMILY_DRUID:
7464 {
7465 switch (dummySpell->Id)
7466 {
7467 // Glyph of Innervate
7468 case 54832:
7469 {
7470 if (procSpell->SpellIconID != 62)
7471 return false;
7472
7473 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7474 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7475 triggered_spell_id = 54833;
7476 target = this;
7477 break;
7478 }
7479 // Glyph of Starfire
7480 case 54845:
7481 {
7482 triggered_spell_id = 54846;
7483 break;
7484 }
7485 // Glyph of Shred
7486 case 54815:
7487 {
7488 if (!target)
7489 return false;
7490
7491 // try to find spell Rip on the target
7492 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7493 {
7494 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7495 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7496
7497 // just Rip's max duration without other spells
7498 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7499
7500 // add possible auras' and Glyph of Shred's max duration
7501 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7502 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7503 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7504
7505 // if min < max -> that means caster didn't cast 3 shred yet
7506 // so set Rip's duration and max duration
7507 if (CountMin < CountMax)
7508 {
7509 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7510 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7511 return true;
7512 }
7513 }
7514 // if not found Rip
7515 return false;
7516 }
7517 // Glyph of Rake
7518 case 54821:
7519 {
7520 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7521 {
7522 if (target && target->IsCreature())
7523 {
7524 triggered_spell_id = 54820;
7525 break;
7526 }
7527 }
7528 return false;
7529 }
7530 // Leader of the Pack
7531 case 24932:
7532 {
7533 if (triggerAmount <= 0)
7534 return false;
7535 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7536 target = this;
7537 triggered_spell_id = 34299;
7538 if (triggeredByAura->GetCasterGUID() != GetGUID())
7539 break;
7540 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7541 // Improved Leader of the Pack
7542 // Check cooldown of heal spell cooldown
7543 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7544 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7545 break;
7546 }
7547 // Healing Touch (Dreamwalker Raiment set)
7548 case 28719:
7549 {
7550 // mana back
7551 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7552 target = this;
7553 triggered_spell_id = 28742;
7554 break;
7555 }
7556 // Glyph of Rejuvenation
7557 case 54754:
7558 {
7559 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7560 return false;
7561 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7562 triggered_spell_id = 54755;
7563 break;
7564 }
7565 // Healing Touch Refund (Idol of Longevity trinket)
7566 case 28847:
7567 {
7568 target = this;
7569 triggered_spell_id = 28848;
7570 break;
7571 }
7572 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7573 case 37288:
7574 case 37295:
7575 {
7576 target = this;
7577 triggered_spell_id = 37238;
7578 break;
7579 }
7580 // Druid Tier 6 Trinket
7581 case 40442:
7582 {
7583 float chance;
7584
7585 // Starfire
7586 if (procSpell->SpellFamilyFlags[0] & 0x4)
7587 {
7588 triggered_spell_id = 40445;
7589 chance = 25.0f;
7590 }
7591 // Rejuvenation
7592 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7593 {
7594 triggered_spell_id = 40446;
7595 chance = 25.0f;
7596 }
7597 // Mangle (Bear) and Mangle (Cat)
7598 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7599 {
7600 triggered_spell_id = 40452;
7601 chance = 40.0f;
7602 }
7603 else
7604 return false;
7605
7606 if (!roll_chance_f(chance))
7607 return false;
7608
7609 target = this;
7610 break;
7611 }
7612 // Maim Interrupt
7613 case 44835:
7614 {
7615 // Deadly Interrupt Effect
7616 triggered_spell_id = 32747;
7617 break;
7618 }
7619 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7620 case 70664:
7621 {
7622 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7623 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7624 return false;
7625
7626 Player* caster = ToPlayer();
7627 if (!caster)
7628 return false;
7629 if (!caster->GetGroup() && victim == this)
7630 return false;
7631
7632 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7633 return true;
7634 }
7635 }
7636 // Eclipse
7637 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7638 {
7639 if (!procSpell || effIndex != 0)
7640 return false;
7641
7642 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7643
7644 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7645 return false;
7646
7647 target = this;
7648 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7649 return false;
7650
7651 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7652 break;
7653 }
7654 [[fallthrough]];
7655 }
7656 case SPELLFAMILY_ROGUE:
7657 {
7658 switch (dummySpell->Id)
7659 {
7660 // Glyph of Backstab
7661 case 56800:
7662 {
7663 if (victim)
7664 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7665 if (Aura* aur = aurEff->GetBase())
7666 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7667 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7668 {
7669 aur->SetDuration(aur->GetDuration() + 2000);
7670 return true;
7671 }
7672 return false;
7673 }
7674 // Deadly Throw Interrupt
7675 case 32748:
7676 {
7677 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7678 if (this == victim)
7679 return false;
7680
7681 triggered_spell_id = 32747;
7682 break;
7683 }
7684 }
7685 // Master of subtlety
7686 if (dummySpell->SpellIconID == 2114)
7687 {
7688 triggered_spell_id = 31665;
7689 basepoints0 = triggerAmount;
7690 break;
7691 }
7692 // Cut to the Chase
7693 if (dummySpell->SpellIconID == 2909)
7694 {
7695 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7696 // lookup Slice and Dice
7697 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7698 {
7699 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7700 return true;
7701 }
7702 return false;
7703 }
7704 // Deadly Brew
7705 else if (dummySpell->SpellIconID == 2963)
7706 {
7707 triggered_spell_id = 3409;
7708 break;
7709 }
7710 // Quick Recovery
7711 else if (dummySpell->SpellIconID == 2116)
7712 {
7713 if (!procSpell)
7714 return false;
7715
7716 // energy cost save
7717 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7718 if (basepoints0 <= 0)
7719 return false;
7720
7721 target = this;
7722 triggered_spell_id = 31663;
7723 break;
7724 }
7725 break;
7726 }
7727 case SPELLFAMILY_HUNTER:
7728 {
7729 switch (dummySpell->SpellIconID)
7730 {
7731 case 2236: // Thrill of the Hunt
7732 {
7733 if (!procSpell)
7734 return false;
7735
7737
7738 // Disable charge drop because of Lock and Load
7739 if (spell)
7740 ToPlayer()->SetSpellModTakingSpell(spell, false);
7741
7742 // Explosive Shot
7743 if (procSpell->SpellFamilyFlags[2] & 0x200)
7744 {
7745 if (!victim)
7746 return false;
7747 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7748 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7749 }
7750 else
7751 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7752
7753 if (spell)
7754 ToPlayer()->SetSpellModTakingSpell(spell, true);
7755
7756 if (basepoints0 <= 0)
7757 return false;
7758
7759 target = this;
7760 triggered_spell_id = 34720;
7761 break;
7762 }
7763 case 3406: // Hunting Party
7764 {
7765 triggered_spell_id = 57669;
7766 target = this;
7767 break;
7768 }
7769 case 3560: // Rapid Recuperation
7770 {
7771 // This effect only from Rapid Killing (mana regen)
7772 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7773 return false;
7774
7775 target = this;
7776
7777 switch (dummySpell->Id)
7778 {
7779 case 53228: // Rank 1
7780 triggered_spell_id = 56654;
7781 break;
7782 case 53232: // Rank 2
7783 triggered_spell_id = 58882;
7784 break;
7785 }
7786 break;
7787 }
7788 }
7789
7790 switch (dummySpell->Id)
7791 {
7792 case 57870: // Glyph of Mend Pet
7793 {
7794 if (!victim)
7795 return false;
7796
7797 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7798 return true;
7799 }
7800 }
7801 break;
7802 }
7804 {
7805 // Light's Beacon - Beacon of Light
7806 if (dummySpell->Id == 53651)
7807 {
7808 if (!victim)
7809 return false;
7810
7811 // Do not proc from Glyph of Holy Light and Judgement of Light
7812 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7813 {
7814 return false;
7815 }
7816
7817 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7818 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7819 return false;
7820
7821 basepoints0 = int32(damage);
7822 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7823
7824 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7825 return true;
7826 }
7827 // Judgements of the Wise
7828 if (dummySpell->SpellIconID == 3017)
7829 {
7830 target = this;
7831 triggered_spell_id = 31930;
7832 // replenishment
7833 CastSpell(this, 57669, true, castItem, triggeredByAura);
7834 break;
7835 }
7836 // Righteous Vengeance
7837 if (dummySpell->SpellIconID == 3025)
7838 {
7839 if (!victim)
7840 return false;
7841
7842 // 4 damage tick
7843 basepoints0 = triggerAmount * damage / 400;
7844 triggered_spell_id = 61840;
7845 // Add remaining ticks to damage done
7846 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7847 return true;
7848 }
7849 // Sheath of Light
7850 if (dummySpell->SpellIconID == 3030)
7851 {
7852 // 4 healing tick
7853 basepoints0 = triggerAmount * damage / 400;
7854 triggered_spell_id = 54203;
7855 break;
7856 }
7857 switch (dummySpell->Id)
7858 {
7859 // Judgement of Light
7860 case 20185:
7861 {
7862 if (!victim || !victim->IsAlive())
7863 return false;
7864
7865 auto* caster = triggeredByAura->GetBase()->GetCaster();
7866 if (!caster || !victim->IsFriendlyTo(caster))
7867 return false;
7868
7869 // 2% of base health
7870 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7871 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7872 return true;
7873 }
7874 // Judgement of Wisdom
7875 case 20186:
7876 {
7877 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA))
7878 return false;
7879
7880 auto* caster = triggeredByAura->GetBase()->GetCaster();
7881 if (!caster || !victim->IsFriendlyTo(caster))
7882 return false;
7883
7884 // 2% of base mana
7885 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7886 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7887 return true;
7888 }
7889 // Holy Power (Redemption Armor set)
7890 case 28789:
7891 {
7892 if (!victim)
7893 return false;
7894
7895 // Set class defined buff
7896 switch (victim->getClass())
7897 {
7898 case CLASS_PALADIN:
7899 case CLASS_PRIEST:
7900 case CLASS_SHAMAN:
7901 case CLASS_DRUID:
7902 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7903 break;
7904 case CLASS_MAGE:
7905 case CLASS_WARLOCK:
7906 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7907 break;
7908 case CLASS_HUNTER:
7909 case CLASS_ROGUE:
7910 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7911 break;
7912 case CLASS_WARRIOR:
7913 triggered_spell_id = 28790; // Increases the friendly target's armor
7914 break;
7915 default:
7916 return false;
7917 }
7918 break;
7919 }
7920 // Seal of Vengeance (damage calc on apply aura)
7921 case 31801:
7922 {
7923 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7924 return false;
7925
7926 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7927 bool stacker = !procSpell || procSpell->Id == 53595;
7928 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7929 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7930
7931 if (!stacker && !damager)
7932 return false;
7933
7934 triggered_spell_id = 31803;
7935
7936 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7937 {
7938 if (aur->GetStackAmount() == 5)
7939 {
7940 if (stacker)
7941 aur->RefreshDuration();
7942 }
7943 }
7944
7945 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7946
7947 if (!stacker)
7948 return false;
7949 break;
7950 }
7951 // Seal of Corruption
7952 case 53736:
7953 {
7954 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7955 return false;
7956
7957 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7958 bool stacker = !procSpell || procSpell->Id == 53595;
7959 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7960 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7961
7962 if (!stacker && !damager)
7963 return false;
7964
7965 triggered_spell_id = 53742;
7966
7967 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7968 {
7969 if (aur->GetStackAmount() == 5)
7970 {
7971 if (stacker)
7972 aur->RefreshDuration();
7973 }
7974 }
7975
7976 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7977
7978 if (!stacker)
7979 return false;
7980 break;
7981 }
7982 // Spiritual Attunement
7983 case 31785:
7984 case 33776:
7985 {
7986 // if healed by another unit (victim)
7987 if (this == victim)
7988 return false;
7989
7990 // dont allow non-positive dots to proc
7991 if (!procSpell || !procSpell->IsPositive())
7992 return false;
7993
7994 HealInfo const* healInfo = eventInfo.GetHealInfo();
7995 if (!healInfo)
7996 {
7997 return false;
7998 }
7999
8000 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
8001 if (effectiveHeal)
8002 {
8003 // heal amount
8004 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
8005 target = this;
8006
8007 if (basepoints0)
8008 triggered_spell_id = 31786;
8009 }
8010 break;
8011 }
8012 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
8013 case 40470:
8014 {
8015 if (!procSpell)
8016 return false;
8017
8018 float chance = 0.0f;
8019
8020 // Flash of light/Holy light
8021 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
8022 {
8023 triggered_spell_id = 40471;
8024 chance = 15.0f;
8025 }
8026 // Judgement (any)
8027 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
8028 {
8029 triggered_spell_id = 40472;
8030 chance = 50.0f;
8031 }
8032 else
8033 return false;
8034
8035 if (!roll_chance_f(chance))
8036 return false;
8037
8038 break;
8039 }
8040 // Glyph of Holy Light
8041 case 54937:
8042 {
8043 triggered_spell_id = 54968;
8044 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8045 break;
8046 }
8047 // Item - Paladin T8 Holy 2P Bonus
8048 case 64890:
8049 {
8050 triggered_spell_id = 64891;
8051 basepoints0 = triggerAmount * damage / 300;
8052 break;
8053 }
8054 case 71406: // Tiny Abomination in a Jar
8055 case 71545: // Tiny Abomination in a Jar (Heroic)
8056 {
8057 if (!victim || !victim->IsAlive())
8058 return false;
8059
8060 CastSpell(this, 71432, true, nullptr, triggeredByAura);
8061
8062 Aura const* dummy = GetAura(71432);
8063 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
8064 return false;
8065
8066 RemoveAurasDueToSpell(71432);
8067 triggered_spell_id = 71433; // default main hand attack
8068 // roll if offhand
8069 if (Player const* player = ToPlayer())
8070 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
8071 triggered_spell_id = 71434;
8072 target = victim;
8073 break;
8074 }
8075 // Item - Icecrown 25 Normal Dagger Proc
8076 case 71880:
8077 {
8078 switch (getPowerType())
8079 {
8080 case POWER_MANA:
8081 triggered_spell_id = 71881;
8082 break;
8083 case POWER_RAGE:
8084 triggered_spell_id = 71883;
8085 break;
8086 case POWER_ENERGY:
8087 triggered_spell_id = 71882;
8088 break;
8089 case POWER_RUNIC_POWER:
8090 triggered_spell_id = 71884;
8091 break;
8092 default:
8093 return false;
8094 }
8095 break;
8096 }
8097 // Item - Icecrown 25 Heroic Dagger Proc
8098 case 71892:
8099 {
8100 switch (getPowerType())
8101 {
8102 case POWER_MANA:
8103 triggered_spell_id = 71888;
8104 break;
8105 case POWER_RAGE:
8106 triggered_spell_id = 71886;
8107 break;
8108 case POWER_ENERGY:
8109 triggered_spell_id = 71887;
8110 break;
8111 case POWER_RUNIC_POWER:
8112 triggered_spell_id = 71885;
8113 break;
8114 default:
8115 return false;
8116 }
8117 break;
8118 }
8119 }
8120 break;
8121 }
8122 case SPELLFAMILY_SHAMAN:
8123 {
8124 switch (dummySpell->Id)
8125 {
8126 // Tidal Force
8127 case 55198:
8128 {
8129 // Remove aura stack from caster
8130 RemoveAuraFromStack(55166);
8131 // drop charges
8132 return false;
8133 }
8134 // Totemic Power (The Earthshatterer set)
8135 case 28823:
8136 {
8137 if (!victim)
8138 return false;
8139
8140 // Set class defined buff
8141 switch (victim->getClass())
8142 {
8143 case CLASS_PALADIN:
8144 case CLASS_PRIEST:
8145 case CLASS_SHAMAN:
8146 case CLASS_DRUID:
8147 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8148 break;
8149 case CLASS_MAGE:
8150 case CLASS_WARLOCK:
8151 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8152 break;
8153 case CLASS_HUNTER:
8154 case CLASS_ROGUE:
8155 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8156 break;
8157 case CLASS_WARRIOR:
8158 triggered_spell_id = 28827; // Increases the friendly target's armor
8159 break;
8160 default:
8161 return false;
8162 }
8163 break;
8164 }
8165 // Lesser Healing Wave (Totem of Flowing Water Relic)
8166 case 28849:
8167 {
8168 target = this;
8169 triggered_spell_id = 28850;
8170 break;
8171 }
8172 // Windfury Weapon (Passive) 1-8 Ranks
8173 case 33757:
8174 {
8175 Player* player = ToPlayer();
8176 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8177 return false;
8178
8179 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8180 return false;
8181
8182 WeaponAttackType attType = player->GetAttackBySlot(castItem->GetSlot());
8183 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8184 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8185 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8186 return false;
8187
8188 // Now amount of extra power stored in 1 effect of Enchant spell
8189 // Get it by item enchant id
8190 uint32 spellId;
8192 {
8193 case 283:
8194 spellId = 8232;
8195 break; // 1 Rank
8196 case 284:
8197 spellId = 8235;
8198 break; // 2 Rank
8199 case 525:
8200 spellId = 10486;
8201 break; // 3 Rank
8202 case 1669:
8203 spellId = 16362;
8204 break; // 4 Rank
8205 case 2636:
8206 spellId = 25505;
8207 break; // 5 Rank
8208 case 3785:
8209 spellId = 58801;
8210 break; // 6 Rank
8211 case 3786:
8212 spellId = 58803;
8213 break; // 7 Rank
8214 case 3787:
8215 spellId = 58804;
8216 break; // 8 Rank
8217 default:
8218 {
8219 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8220 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8221 return false;
8222 }
8223 }
8224
8225 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8226 if (!windfurySpellInfo)
8227 {
8228 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8229 return false;
8230 }
8231
8232 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8233
8234 // Value gained from additional AP
8235 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8236
8237 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8238 triggered_spell_id = 25504;
8239
8240 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8241 triggered_spell_id = 33750;
8242
8243 // custom cooldown processing case
8244 if (player->HasSpellCooldown(dummySpell->Id))
8245 return false;
8246
8247 // apply cooldown before cast to prevent processing itself
8248 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8249
8250 // Attack Twice
8251 for (uint32 i = 0; i < 2; ++i)
8252 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8253
8254 return true;
8255 }
8256 // Shaman Tier 6 Trinket
8257 case 40463:
8258 {
8259 if (!procSpell)
8260 return false;
8261
8262 float chance;
8263 if (procSpell->SpellFamilyFlags[0] & 0x1)
8264 {
8265 triggered_spell_id = 40465; // Lightning Bolt
8266 chance = 15.0f;
8267 }
8268 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8269 {
8270 triggered_spell_id = 40465; // Lesser Healing Wave
8271 chance = 10.0f;
8272 }
8273 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8274 {
8275 triggered_spell_id = 40466; // Stormstrike
8276 chance = 50.0f;
8277 }
8278 else
8279 return false;
8280
8281 if (!roll_chance_f(chance))
8282 return false;
8283
8284 target = this;
8285 break;
8286 }
8287 // Glyph of Healing Wave
8288 case 55440:
8289 {
8290 // Not proc from self heals
8291 if (this == victim)
8292 return false;
8293 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8294 target = this;
8295 triggered_spell_id = 55533;
8296 break;
8297 }
8298 // Spirit Hunt
8299 case 58877:
8300 {
8301 // Cast on owner
8302 target = GetOwner();
8303 if (!target)
8304 return false;
8305 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8306 triggered_spell_id = 58879;
8307 // Heal wolf
8308 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8309 break;
8310 }
8311 // Shaman T9 Elemental 4P Bonus
8312 case 67228:
8313 {
8314 // Lava Burst
8315 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8316 {
8317 triggered_spell_id = 71824;
8318 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8319 if (!triggeredSpell)
8320 return false;
8321 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8322 }
8323 break;
8324 }
8325 // Item - Shaman T10 Elemental 4P Bonus
8326 case 70817:
8327 {
8328 if (!target)
8329 return false;
8330 // try to find spell Flame Shock on the target
8331 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8332 {
8333 Aura* flameShock = aurEff->GetBase();
8334 int32 extraTime = 2 * aurEff->GetAmplitude();
8335 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8336 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8337
8338 return true;
8339 }
8340 // if not found Flame Shock
8341 return false;
8342 }
8343 break;
8344 }
8345 // Frozen Power
8346 if (dummySpell->SpellIconID == 3780)
8347 {
8348 if (!target)
8349 return false;
8350 if (GetDistance(target) < 15.0f)
8351 return false;
8352 float chance = (float)triggerAmount;
8353 if (!roll_chance_f(chance))
8354 return false;
8355
8356 triggered_spell_id = 63685;
8357 break;
8358 }
8359 // Ancestral Awakening
8360 if (dummySpell->SpellIconID == 3065)
8361 {
8362 triggered_spell_id = 52759;
8363 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8364 target = this;
8365 break;
8366 }
8367 // Flametongue Weapon (Passive)
8368 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8369 {
8370 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8371 return false;
8372
8373 WeaponAttackType attType = Player::GetAttackBySlot(castItem->GetSlot());
8374 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8375 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8376 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8377 return false;
8378
8379 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8380
8381 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8383
8384 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8385 ApplyPct(add_spellpower, 3.84f);
8386
8387 // Enchant on Off-Hand and ready?
8388 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8389 {
8390 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8391
8392 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8393 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8394 triggered_spell_id = 10444;
8395 }
8396
8397 // Enchant on Main-Hand and ready?
8398 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8399 {
8400 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8401
8402 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8403 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8404 triggered_spell_id = 10444;
8405 }
8406
8407 // If not ready, we should return, shouldn't we?!
8408 else
8409 return false;
8410
8411 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8412 return true;
8413 }
8414 // Improved Water Shield
8415 if (dummySpell->SpellIconID == 2287)
8416 {
8417 if (!procSpell)
8418 return false;
8419
8420 // Default chance for Healing Wave and Riptide
8421 float chance = (float)triggeredByAura->GetAmount();
8422
8423 if (procSpell->SpellFamilyFlags[0] & 0x80)
8424 // Lesser Healing Wave - 0.6 of default
8425 chance *= 0.6f;
8426 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8427 // Chain heal - 0.3 of default
8428 chance *= 0.3f;
8429
8430 if (!roll_chance_f(chance))
8431 return false;
8432
8433 // Water Shield
8434 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8435 {
8436 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8437 CastSpell(this, spell, true, castItem, triggeredByAura);
8438 return true;
8439 }
8440 return false;
8441 }
8442 // Lightning Overload
8443 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8444 {
8445 if (!procSpell || !IsPlayer() || !victim)
8446 return false;
8447
8448 uint32 spell = 45284;
8449
8450 // chain lightning only procs 1/3 of the time
8451 if (procSpell->SpellFamilyFlags[0] & 0x2)
8452 {
8453 if (!roll_chance_i(33))
8454 return false;
8455 spell = 45297;
8456 }
8457
8458 if (procEx & PROC_EX_CRITICAL_HIT)
8459 damage /= 2;
8460
8461 // do not reduce damage-spells have correct basepoints
8462 damage /= 2;
8463 int32 dmg = damage;
8464
8465 // Cast
8466 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8467 return true;
8468 }
8469 // Static Shock
8470 if (dummySpell->SpellIconID == 3059)
8471 {
8472 // Lightning Shield
8474 {
8475 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8476 CastSpell(target, spell, true, castItem, triggeredByAura);
8477 aurEff->GetBase()->DropCharge();
8478 return true;
8479 }
8480 return false;
8481 }
8482 break;
8483 }
8485 {
8486 // Improved Blood Presence
8487 if (dummySpell->SpellIconID == 2636)
8488 {
8489 if (!IsPlayer())
8490 return false;
8491 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8492 break;
8493 }
8494 // Butchery
8495 if (dummySpell->SpellIconID == 2664)
8496 {
8497 basepoints0 = triggerAmount;
8498 triggered_spell_id = 50163;
8499 target = this;
8500 break;
8501 }
8502 // Mark of Blood
8503 if (dummySpell->Id == 49005)
8504 {
8506 triggered_spell_id = 61607;
8507 break;
8508 }
8509 // Unholy Blight
8510 if (dummySpell->Id == 49194)
8511 {
8512 triggered_spell_id = 50536;
8513 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8514 if (!unholyBlight || !victim)
8515 return false;
8516
8517 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8518
8519 //Glyph of Unholy Blight
8520 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8521 AddPct(basepoints0, glyph->GetAmount());
8522
8523 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8524 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8525 return true;
8526 }
8527 // Vendetta
8528 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8529 {
8530 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8531 triggered_spell_id = 50181;
8532 target = this;
8533 break;
8534 }
8535 // Necrosis
8536 if (dummySpell->SpellIconID == 2709)
8537 {
8538 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8539 triggered_spell_id = 51460;
8540 break;
8541 }
8542 // Threat of Thassarian
8543 if (dummySpell->SpellIconID == 2023)
8544 {
8545 // Must Dual Wield
8546 if (!procSpell || !HasOffhandWeaponForAttack())
8547 return false;
8548 // Chance as basepoints for dummy aura
8549 if (!roll_chance_i(triggerAmount))
8550 return false;
8551
8552 switch (procSpell->Id)
8553 {
8554 // Obliterate
8555 case 49020:
8556 triggered_spell_id = 66198;
8557 break; // Rank 1
8558 case 51423:
8559 triggered_spell_id = 66972;
8560 break; // Rank 2
8561 case 51424:
8562 triggered_spell_id = 66973;
8563 break; // Rank 3
8564 case 51425:
8565 triggered_spell_id = 66974;
8566 break; // Rank 4
8567
8568 // Frost Strike
8569 case 49143:
8570 triggered_spell_id = 66196;
8571 break; // Rank 1
8572 case 51416:
8573 triggered_spell_id = 66958;
8574 break; // Rank 2
8575 case 51417:
8576 triggered_spell_id = 66959;
8577 break; // Rank 3
8578 case 51418:
8579 triggered_spell_id = 66960;
8580 break; // Rank 4
8581 case 51419:
8582 triggered_spell_id = 66961;
8583 break; // Rank 5
8584 case 55268:
8585 triggered_spell_id = 66962;
8586 break; // Rank 6
8587
8588 // Plague Strike
8589 case 45462:
8590 triggered_spell_id = 66216;
8591 break; // Rank 1
8592 case 49917:
8593 triggered_spell_id = 66988;
8594 break; // Rank 2
8595 case 49918:
8596 triggered_spell_id = 66989;
8597 break; // Rank 3
8598 case 49919:
8599 triggered_spell_id = 66990;
8600 break; // Rank 4
8601 case 49920:
8602 triggered_spell_id = 66991;
8603 break; // Rank 5
8604 case 49921:
8605 triggered_spell_id = 66992;
8606 break; // Rank 6
8607
8608 // Death Strike
8609 case 49998:
8610 triggered_spell_id = 66188;
8611 break; // Rank 1
8612 case 49999:
8613 triggered_spell_id = 66950;
8614 break; // Rank 2
8615 case 45463:
8616 triggered_spell_id = 66951;
8617 break; // Rank 3
8618 case 49923:
8619 triggered_spell_id = 66952;
8620 break; // Rank 4
8621 case 49924:
8622 triggered_spell_id = 66953;
8623 break; // Rank 5
8624
8625 // Rune Strike
8626 case 56815:
8627 triggered_spell_id = 66217;
8628 break; // Rank 1
8629
8630 // Blood Strike
8631 case 45902:
8632 triggered_spell_id = 66215;
8633 break; // Rank 1
8634 case 49926:
8635 triggered_spell_id = 66975;
8636 break; // Rank 2
8637 case 49927:
8638 triggered_spell_id = 66976;
8639 break; // Rank 3
8640 case 49928:
8641 triggered_spell_id = 66977;
8642 break; // Rank 4
8643 case 49929:
8644 triggered_spell_id = 66978;
8645 break; // Rank 5
8646 case 49930:
8647 triggered_spell_id = 66979;
8648 break; // Rank 6
8649 default:
8650 return false;
8651 }
8652
8653 // This should do, restore spell mod so next attack can also use this!
8654 // crit chance for first strike is already computed
8655 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8656 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8657
8658 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8659 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8660 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8661 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8662
8663 SetCantProc(true);
8664 if (basepoints0)
8665 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8666 else
8667 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8668 SetCantProc(false);
8669 return true;
8670 }
8671 // Runic Power Back on Snare/Root
8672 if (dummySpell->Id == 61257)
8673 {
8674 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8675 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8676 return false;
8677 // Need snare or root mechanic
8678 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8679 return false;
8680 triggered_spell_id = 61258;
8681 target = this;
8682 break;
8683 }
8684 // Sudden Doom
8685 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8686 {
8687 SpellChainNode const* chain = nullptr;
8688 // get highest rank of the Death Coil spell
8689 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8690 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8691 {
8692 // check if shown in spell book
8693 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8694 continue;
8695
8696 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8697 if (!spellProto)
8698 continue;
8699
8700 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8701 && spellProto->SpellFamilyFlags[0] & 0x2000)
8702 {
8703 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8704
8705 // No chain entry or entry lower than found entry
8706 if (!chain || !newChain || (chain->rank < newChain->rank))
8707 {
8708 triggered_spell_id = itr->first;
8709 chain = newChain;
8710 }
8711 else
8712 continue;
8713 // Found spell is last in chain - do not need to look more
8714 // Optimisation for most common case
8715 if (chain && chain->last->Id == itr->first)
8716 break;
8717 }
8718 }
8719 }
8720 break;
8721 }
8722 case SPELLFAMILY_POTION:
8723 {
8724 // alchemist's stone
8725 if (dummySpell->Id == 17619)
8726 {
8727 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8728 {
8729 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8730 {
8731 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8732 {
8733 triggered_spell_id = 21399;
8734 }
8735 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8736 {
8737 triggered_spell_id = 21400;
8738 }
8739 else
8740 continue;
8741
8742 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8743 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8744 }
8745 return true;
8746 }
8747 }
8748 break;
8749 }
8750 case SPELLFAMILY_PET:
8751 {
8752 switch (dummySpell->SpellIconID)
8753 {
8754 // Guard Dog
8755 case 201:
8756 {
8757 if (!victim)
8758 return false;
8759
8760 triggered_spell_id = 54445;
8761 target = this;
8762 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8763 victim->AddThreat(this, addThreat);
8764 break;
8765 }
8766 // Silverback
8767 case 1582:
8768 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8769 target = this;
8770 break;
8771 }
8772 break;
8773 }
8774 default:
8775 break;
8776 }
8777
8778 // if not handled by custom case, get triggered spell from dummySpell proto
8779 if (!triggered_spell_id)
8780 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8781
8782 // processed charge only counting case
8783 if (!triggered_spell_id)
8784 return true;
8785
8786 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8787 if (!triggerEntry)
8788 {
8789 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8790 return false;
8791 }
8792
8793 if (cooldown_spell_id == 0)
8794 cooldown_spell_id = triggered_spell_id;
8795
8796 if (cooldown)
8797 {
8798 if (HasSpellCooldown(cooldown_spell_id))
8799 return false;
8800
8801 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8802 }
8803
8804 if (basepoints0)
8805 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8806 else
8807 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8808
8809 return true;
8810}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition CreatureAIImpl.h:25
EnchantmentSlot
Definition Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:210
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:195
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:685
@ PLAYERSPELL_REMOVED
Definition Player.h:123
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
@ SPELL_EFFECT_ENERGIZE
Definition SharedDefines.h:819
@ LANG_UNIVERSAL
Definition SharedDefines.h:746
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ MECHANIC_STUN
Definition SharedDefines.h:1348
@ MECHANIC_ROOT
Definition SharedDefines.h:1343
@ MECHANIC_SNARE
Definition SharedDefines.h:1347
@ SPELLFAMILY_WARLOCK
Definition SharedDefines.h:3799
@ SPELLFAMILY_PALADIN
Definition SharedDefines.h:3804
@ SPELLFAMILY_HUNTER
Definition SharedDefines.h:3803
@ SPELLFAMILY_POTION
Definition SharedDefines.h:3807
@ SPELLFAMILY_ROGUE
Definition SharedDefines.h:3802
@ SPELLFAMILY_DRUID
Definition SharedDefines.h:3801
@ SPELLFAMILY_PET
Definition SharedDefines.h:3811
@ REP_EXALTED
Definition SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition SharedDefines.h:313
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:310
@ SPELL_SCHOOL_MASK_FROST
Definition SharedDefines.h:312
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition SpellMgr.h:122
WeaponAttackType
Definition Unit.h:210
T ApplyPct(T &base, U pct)
Definition Util.h:73
Definition Unit.h:375
uint32 GetEffectiveHeal() const
Definition Unit.h:415
uint8 GetSlot() const
Definition Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
bool IsEquipped() const
Definition Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10107
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9955
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16360
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1768
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11107
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2168
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5881
Unit * GetSelectedUnit() const
Definition Player.cpp:11549
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3535
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9408
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:408
Spell * m_spellModTakingSpell
Definition Player.h:2558
static WeaponAttackType GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:543
uint32 ProcChance
Definition SpellInfo.h:356
SpellInfo const * GetSpellInfo() const
Definition Spell.h:587
int32 GetPowerCost() const
Definition Spell.h:588
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15671
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5649
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition Unit.cpp:5321
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14876
void SetCantProc(bool apply)
Definition Unit.cpp:17308
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1078
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4977
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition Unit.cpp:12049
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10292
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12010
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1083
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition Unit.cpp:20067
Powers getPowerType() const
Definition Unit.h:1093
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:5302
Definition SpellMgr.h:554
SpellInfo const * last
Definition SpellMgr.h:558
uint8 rank
Definition SpellMgr.h:559
SpellInfo const * first
Definition SpellMgr.h:557

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellChainNode::first, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2036{
2038 packet.EmoteID = emoteId;
2039 packet.Guid = GetGUID();
2040 SendMessageToSet(packet.Write(), true);
2041}
Definition ChatPackets.h:29
WorldPacket const * Write() override
Definition ChatPackets.cpp:20
uint32 EmoteID
Definition ChatPackets.h:35
ObjectGuid Guid
Definition ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), spell_chapter5_return_to_capital::HandleHit(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9913{
9914 int32 scriptId = triggeredByAura->GetMiscValue();
9915
9916 if (!victim || !victim->IsAlive())
9917 return false;
9918
9919 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9920 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9921
9922 uint32 triggered_spell_id = 0;
9923
9924 switch (scriptId)
9925 {
9926 case 836: // Improved Blizzard (Rank 1)
9927 {
9928 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9929 return false;
9930 triggered_spell_id = 12484;
9931 break;
9932 }
9933 case 988: // Improved Blizzard (Rank 2)
9934 {
9935 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9936 return false;
9937 triggered_spell_id = 12485;
9938 break;
9939 }
9940 case 989: // Improved Blizzard (Rank 3)
9941 {
9942 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9943 return false;
9944 triggered_spell_id = 12486;
9945 break;
9946 }
9947 case 4533: // Dreamwalker Raiment 2 pieces bonus
9948 {
9949 // Chance 50%
9950 if (!roll_chance_i(50))
9951 return false;
9952
9953 switch (victim->getPowerType())
9954 {
9955 case POWER_MANA:
9956 triggered_spell_id = 28722;
9957 break;
9958 case POWER_RAGE:
9959 triggered_spell_id = 28723;
9960 break;
9961 case POWER_ENERGY:
9962 triggered_spell_id = 28724;
9963 break;
9964 default:
9965 return false;
9966 }
9967 break;
9968 }
9969 case 4537: // Dreamwalker Raiment 6 pieces bonus
9970 triggered_spell_id = 28750; // Blessing of the Claw
9971 break;
9972 case 5497: // Improved Mana Gems
9973 triggered_spell_id = 37445; // Mana Surge
9974 break;
9975 case 7010: // Revitalize - can proc on full hp target
9976 case 7011:
9977 case 7012:
9978 {
9979 if (!roll_chance_i(triggeredByAura->GetAmount()))
9980 return false;
9981 switch (victim->getPowerType())
9982 {
9983 case POWER_MANA:
9984 triggered_spell_id = 48542;
9985 break;
9986 case POWER_RAGE:
9987 triggered_spell_id = 48541;
9988 break;
9989 case POWER_ENERGY:
9990 triggered_spell_id = 48540;
9991 break;
9992 case POWER_RUNIC_POWER:
9993 triggered_spell_id = 48543;
9994 break;
9995 default:
9996 break;
9997 }
9998 break;
9999 }
10000 default:
10001 break;
10002 }
10003
10004 // not processed
10005 if (!triggered_spell_id)
10006 return false;
10007
10008 // standard non-dummy case
10009 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
10010
10011 if (!triggerEntry)
10012 {
10013 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10014 return false;
10015 }
10016
10017 if (cooldown)
10018 {
10019 if (HasSpellCooldown(triggered_spell_id))
10020 return false;
10021
10022 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10023 }
10024
10025 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10026
10027 return true;
10028}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2796{
2797 while (count)
2798 {
2799 --count;
2800 AttackerStateUpdate(victim, BASE_ATTACK, true);
2801 }
2802}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2600

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
9010{
9011 // Get triggered aura spell info
9012 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
9013
9014 // Basepoints of trigger aura
9015 int32 triggerAmount = triggeredByAura->GetAmount();
9016
9017 // Set trigger spell id, target, custom basepoints
9018 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
9019
9020 Unit* target = nullptr;
9021 int32 basepoints0 = 0;
9022
9023 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
9024 basepoints0 = triggerAmount;
9025
9026 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9027 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9028
9029 // Try handle unknown trigger spells
9030 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
9031 {
9032 switch (auraSpellInfo->SpellFamilyName)
9033 {
9035 switch (auraSpellInfo->Id)
9036 {
9037 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
9038 // Pct value stored in dummy
9039 if (!victim)
9040 return false;
9041 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
9042 target = victim;
9043 break;
9044 case 57345: // Darkmoon Card: Greatness
9045 {
9046 float stat = 0.0f;
9047 // strength
9048 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
9049 // agility
9050 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
9051 // intellect
9052 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
9053 // spirit
9054 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
9055 break;
9056 }
9057 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
9058 {
9059 if (!damage)
9060 return false;
9061 float stat = 0.0f;
9062 // strength
9063 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
9064 // agility
9065 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
9066 break;
9067 }
9068 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
9069 {
9070 if (!damage)
9071 return false;
9072 float stat = 0.0f;
9073 // strength
9074 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9075 // agility
9076 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9077 break;
9078 }
9079 case 27522: // Mana Drain Trigger
9080 case 40336: // Mana Drain Trigger
9081 case 46939: // Black Bow of the Betrayer
9082 {
9083 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9084 if (IsAlive())
9085 CastSpell(this, 29471, true, castItem, triggeredByAura);
9086 if (victim && victim->IsAlive())
9087 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9088 return true;
9089 }
9090 // Forge of Souls, Devourer of Souls, Mirrored Soul
9091 case 69023:
9092 {
9093 int32 dmg = damage * 0.45f;
9094 if (dmg > 0)
9095 if (Aura* a = GetAura(69023))
9096 if (Unit* c = a->GetCaster())
9097 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9098 return true;
9099 }
9100 // Soul-Trader Beacon proc aura
9101 case 50051:
9102 {
9103 if (!victim)
9104 return false;
9105
9106 if (Creature* cr = GetCompanionPet())
9107 cr->CastSpell(victim, 50101, true);
9108
9109 return false;
9110 }
9111 }
9112 break;
9113 case SPELLFAMILY_MAGE:
9114 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9115 {
9116 switch (auraSpellInfo->Id)
9117 {
9118 case 31641: // Rank 1
9119 case 31642: // Rank 2
9120 trigger_spell_id = 31643;
9121 break;
9122 default:
9123 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9124 return false;
9125 }
9126 }
9127 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9128 {
9129 Creature* creature = victim->ToCreature();
9130 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9131 return false;
9132 }
9133 break;
9135 {
9136 // Nether Protection
9137 if (auraSpellInfo->SpellIconID == 1985)
9138 {
9139 if (!procSpell)
9140 return false;
9141 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9142 {
9144 return false; // ignore
9145 case SPELL_SCHOOL_HOLY:
9146 trigger_spell_id = 54370;
9147 break;
9148 case SPELL_SCHOOL_FIRE:
9149 trigger_spell_id = 54371;
9150 break;
9152 trigger_spell_id = 54375;
9153 break;
9154 case SPELL_SCHOOL_FROST:
9155 trigger_spell_id = 54372;
9156 break;
9158 trigger_spell_id = 54374;
9159 break;
9161 trigger_spell_id = 54373;
9162 break;
9163 default:
9164 return false;
9165 }
9166 }
9167 break;
9168 }
9169 case SPELLFAMILY_PRIEST:
9170 {
9171 // Blessed Recovery
9172 if (auraSpellInfo->SpellIconID == 1875)
9173 {
9174 switch (auraSpellInfo->Id)
9175 {
9176 case 27811:
9177 trigger_spell_id = 27813;
9178 break;
9179 case 27815:
9180 trigger_spell_id = 27817;
9181 break;
9182 case 27816:
9183 trigger_spell_id = 27818;
9184 break;
9185 default:
9186 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9187 return false;
9188 }
9189 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9190 target = this;
9191 // Add remaining ticks to healing done
9192 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9193 return true;
9194 }
9195 break;
9196 }
9197 case SPELLFAMILY_DRUID:
9198 {
9199 switch (auraSpellInfo->Id)
9200 {
9201 // Druid Forms Trinket
9202 case 37336:
9203 {
9204 switch (GetShapeshiftForm())
9205 {
9206 case FORM_NONE:
9207 trigger_spell_id = 37344;
9208 break;
9209 case FORM_CAT:
9210 trigger_spell_id = 37341;
9211 break;
9212 case FORM_BEAR:
9213 case FORM_DIREBEAR:
9214 trigger_spell_id = 37340;
9215 break;
9216 case FORM_TREE:
9217 trigger_spell_id = 37342;
9218 break;
9219 case FORM_MOONKIN:
9220 trigger_spell_id = 37343;
9221 break;
9222 default:
9223 return false;
9224 }
9225 break;
9226 }
9227 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9228 case 67353:
9229 {
9230 switch (GetShapeshiftForm())
9231 {
9232 case FORM_CAT:
9233 trigger_spell_id = 67355;
9234 break;
9235 case FORM_BEAR:
9236 case FORM_DIREBEAR:
9237 trigger_spell_id = 67354;
9238 break;
9239 default:
9240 return false;
9241 }
9242 break;
9243 }
9244 default:
9245 break;
9246 }
9247 break;
9248 }
9249 case SPELLFAMILY_HUNTER:
9250 {
9251 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9252 {
9253 if (!victim)
9254 return false;
9255
9256 switch (auraSpellInfo->Id)
9257 {
9258 case 53234: // Rank 1
9259 case 53237: // Rank 2
9260 case 53238: // Rank 3
9261 trigger_spell_id = 63468;
9262 break;
9263 default:
9264 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9265 return false;
9266 }
9267 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9268 if (!TriggerPS)
9269 return false;
9270
9271 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9272 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9273 return true;
9274 }
9275 // Item - Hunter T9 4P Bonus (Steady Shot)
9276 else if (auraSpellInfo->Id == 67151)
9277 {
9278 if (!IsPlayer() || !ToPlayer()->GetPet())
9279 return false;
9280
9281 target = ToPlayer()->GetPet();
9282 trigger_spell_id = 68130;
9283 break;
9284 }
9285 break;
9286 }
9288 {
9289 switch (auraSpellInfo->Id)
9290 {
9291 case 37657: // Lightning Capacitor
9292 case 54841: // Thunder Capacitor
9293 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9294 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9295 {
9296 if (!victim || !victim->IsAlive() || !IsPlayer())
9297 return false;
9298
9299 uint32 stack_spell_id = 0;
9300 switch (auraSpellInfo->Id)
9301 {
9302 case 37657:
9303 stack_spell_id = 37658;
9304 trigger_spell_id = 37661;
9305 break;
9306 case 54841:
9307 stack_spell_id = 54842;
9308 trigger_spell_id = 54843;
9309 break;
9310 case 67712:
9311 stack_spell_id = 67713;
9312 trigger_spell_id = 67714;
9313 break;
9314 case 67758:
9315 stack_spell_id = 67759;
9316 trigger_spell_id = 67760;
9317 break;
9318 }
9319
9320 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9321 {
9322 return false;
9323 }
9324
9325 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9326
9327 Aura* dummy = GetAura(stack_spell_id);
9328 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9329 {
9330 return false;
9331 }
9332
9333 if (cooldown)
9334 {
9335 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9336 }
9337 RemoveAurasDueToSpell(stack_spell_id);
9338 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9339 return true;
9340 }
9341 default:
9342 // Illumination
9343 if (auraSpellInfo->SpellIconID == 241)
9344 {
9345 if (!procSpell)
9346 return false;
9347 // procspell is triggered spell but we need mana cost of original casted spell
9348 uint32 originalSpellId = procSpell->Id;
9349 // Holy Shock heal
9350 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9351 {
9352 switch (procSpell->Id)
9353 {
9354 case 25914:
9355 originalSpellId = 20473;
9356 break;
9357 case 25913:
9358 originalSpellId = 20929;
9359 break;
9360 case 25903:
9361 originalSpellId = 20930;
9362 break;
9363 case 27175:
9364 originalSpellId = 27174;
9365 break;
9366 case 33074:
9367 originalSpellId = 33072;
9368 break;
9369 case 48820:
9370 originalSpellId = 48824;
9371 break;
9372 case 48821:
9373 originalSpellId = 48825;
9374 break;
9375 default:
9376 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9377 return false;
9378 }
9379 }
9380 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9381 if (!originalSpell)
9382 {
9383 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9384 return false;
9385 }
9386 // percent stored in effect 1 (class scripts) base points
9387 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9388 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9389 trigger_spell_id = 20272;
9390 target = this;
9391 }
9392 break;
9393 }
9394 break;
9395 }
9396 case SPELLFAMILY_SHAMAN:
9397 {
9398 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9399 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9400 {
9401 // Do not proc off from self-casted items
9402 if (Spell const* spell = eventInfo.GetProcSpell())
9403 {
9404 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9405 {
9406 return false;
9407 }
9408 }
9409
9410 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9411 }
9412 // Nature's Guardian
9413 else if (auraSpellInfo->SpellIconID == 2013)
9414 {
9415 // Check health condition - should drop to less 30% (damage deal after this!)
9416 if (!HealthBelowPctDamaged(30, damage))
9417 return false;
9418
9419 if (victim && victim->IsAlive())
9420 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9421
9422 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9423 trigger_spell_id = 31616;
9424 target = this;
9425 }
9426 break;
9427 }
9429 {
9430 // Acclimation
9431 if (auraSpellInfo->SpellIconID == 1930)
9432 {
9433 if (!procSpell)
9434 return false;
9435 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9436 {
9438 return false; // ignore
9439 case SPELL_SCHOOL_HOLY:
9440 trigger_spell_id = 50490;
9441 break;
9442 case SPELL_SCHOOL_FIRE:
9443 trigger_spell_id = 50362;
9444 break;
9446 trigger_spell_id = 50488;
9447 break;
9448 case SPELL_SCHOOL_FROST:
9449 trigger_spell_id = 50485;
9450 break;
9452 trigger_spell_id = 50489;
9453 break;
9455 trigger_spell_id = 50486;
9456 break;
9457 default:
9458 return false;
9459 }
9460 }
9461 // Blood Presence (Improved)
9462 else if (auraSpellInfo->Id == 63611)
9463 {
9464 if (!IsPlayer())
9465 return false;
9466
9467 trigger_spell_id = 50475;
9468 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9469 }
9470 break;
9471 }
9472 }
9473 }
9474
9475 // All ok. Check current trigger spell
9476 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9477 if (!triggerEntry)
9478 {
9479 // Don't cast unknown spell
9480 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9481 return false;
9482 }
9483
9484 // not allow proc extra attack spell at extra attack
9485 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9486 {
9487 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9488
9489 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9490 if (lastExtraAttackSpell == trigger_spell_id)
9491 {
9492 return false;
9493 }
9494
9495 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9496 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9497 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9498 {
9499 return false;
9500 }
9501 }
9502
9503 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9504 // Custom triggered spells
9505 switch (auraSpellInfo->Id)
9506 {
9507 // Deep Wounds
9508 case 12834:
9509 case 12849:
9510 case 12867:
9511 {
9512 if (!IsPlayer())
9513 return false;
9514
9515 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9517 else
9519 break;
9520 }
9521 // Persistent Shield (Scarab Brooch trinket)
9522 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9523 case 26467:
9524 {
9525 basepoints0 = int32(CalculatePct(damage, 15));
9526 target = victim;
9527 trigger_spell_id = 26470;
9528 break;
9529 }
9530 // Unyielding Knights (item exploit 29108\29109)
9531 case 38164:
9532 {
9533 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9534 return false;
9535 break;
9536 }
9537 // Deflection
9538 case 52420:
9539 {
9540 if (!HealthBelowPct(35))
9541 return false;
9542 break;
9543 }
9544
9545 // Cheat Death
9546 case 28845:
9547 {
9548 // When your health drops below 20%
9549 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9550 return false;
9551 break;
9552 }
9553 // Deadly Swiftness (Rank 1)
9554 case 31255:
9555 {
9556 // whenever you deal damage to a target who is below 20% health.
9557 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9558 return false;
9559
9560 target = this;
9561 trigger_spell_id = 22588;
9562 [[fallthrough]];
9563 }
9564 // Bonus Healing (Crystal Spire of Karabor mace)
9565 case 40971:
9566 {
9567 // If your target is below $s1% health
9568 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9569 return false;
9570 break;
9571 }
9572 // Rapid Recuperation
9573 case 53228:
9574 case 53232:
9575 {
9576 // This effect only from Rapid Fire (ability cast)
9577 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9578 return false;
9579 break;
9580 }
9581 // Decimation
9582 case 63156:
9583 case 63158:
9584 // Can proc only if target has hp below 35%
9585 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9586 return false;
9587 break;
9588 // Ulduar, Hodir, Toasty Fire
9589 case 62821:
9590 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9591 return false;
9592 break;
9593 case 15337: // Improved Spirit Tap (Rank 1)
9594 case 15338: // Improved Spirit Tap (Rank 2)
9595 {
9596 if (!procSpell)
9597 return false;
9598
9599 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9600 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9601 return false;
9602
9603 target = victim;
9604 break;
9605 }
9606 // Professor Putricide - Ooze Spell Tank Protection
9607 case 71770:
9608 if (victim)
9609 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9610 return true;
9611 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9612 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9613 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9614 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9615 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9616 {
9617 // Procs only if damage takes health below $s1%
9618 if (!HealthBelowPctDamaged(triggerAmount, damage))
9619 return false;
9620 break;
9621 }
9622 default:
9623 break;
9624 }
9625
9626 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9627 {
9628 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9629 // Item - Death Knight T10 Melee 4P Bonus
9630 if (auraSpellInfo->Id == 70656)
9631 {
9633 return false;
9634
9635 for (uint8 i = 0; i < MAX_RUNES; ++i)
9636 if (ToPlayer()->GetRuneCooldown(i) == 0)
9637 return false;
9638 }
9639 // Blade Barrier
9640 else if (auraSpellInfo->SpellIconID == 85)
9641 {
9642 Player* plr = ToPlayer();
9643 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9644 return false;
9645
9647 return false;
9648 }
9649 // Rime
9650 else if (auraSpellInfo->SpellIconID == 56)
9651 {
9652 if (!IsPlayer())
9653 return false;
9654
9655 // Howling Blast
9657 }
9658 }
9659
9660 // Custom basepoints/target for exist spell
9661 // dummy basepoints or other customs
9662 switch (trigger_spell_id)
9663 {
9664 // Auras which should proc on area aura source (caster in this case):
9665 // Turn the Tables
9666 case 52914:
9667 case 52915:
9668 case 52910:
9669 // Honor Among Thieves
9670 case 51699:
9671 {
9672 target = triggeredByAura->GetBase()->GetCaster();
9673 if (!target)
9674 return false;
9675
9676 if (Player* pTarget = target->ToPlayer())
9677 {
9678 if (cooldown)
9679 {
9680 if (pTarget->HasSpellCooldown(trigger_spell_id))
9681 return false;
9682 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9683 }
9684
9685 Unit* cptarget = nullptr;
9686 if (trigger_spell_id == 51699)
9687 {
9688 cptarget = pTarget->GetComboTarget();
9689 if (!cptarget)
9690 {
9691 cptarget = pTarget->GetSelectedUnit();
9692 }
9693 }
9694 else
9695 cptarget = target;
9696
9697 if (cptarget)
9698 {
9699 target->CastSpell(cptarget, trigger_spell_id, true);
9700 return true;
9701 }
9702 }
9703 return false;
9704 }
9705 // Cast positive spell on enemy target
9706 case 20233: // Improved Lay on Hands (cast on target)
9707 {
9708 target = victim;
9709 break;
9710 }
9711 // Ruby Drake, Evasive Aura
9712 case 50241:
9713 {
9714 if (GetAura(50240))
9715 return false;
9716
9717 break;
9718 }
9719 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9720 case 15250: // Rogue Setup
9721 {
9722 // applied only for main target
9723 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9724 return false;
9725 break; // continue normal case
9726 }
9727 // Finish movies that add combo
9728 case 14189: // Seal Fate (Netherblade set)
9729 case 14157: // Ruthlessness
9730 {
9731 victim = nullptr;
9732 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9733 break;
9734 }
9735 // Item - Druid T10 Balance 2P Bonus
9736 case 16870:
9737 {
9738 if (HasAura(70718))
9739 CastSpell(this, 70721, true);
9740 RemoveAurasDueToSpell(trigger_spell_id);
9741 break;
9742 }
9743 // Shamanistic Rage triggered spell
9744 case 30824:
9745 {
9746 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9747 break;
9748 }
9749 // Enlightenment (trigger only from mana cost spells)
9750 case 35095:
9751 {
9752 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9753 return false;
9754 break;
9755 }
9756 case 46916: // Slam! (Bloodsurge proc)
9757 case 52437: // Sudden Death
9758 {
9759 // Item - Warrior T10 Melee 4P Bonus
9760 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9761 {
9762 if (!roll_chance_i(aurEff->GetAmount()))
9763 {
9764 // Xinef: dont allow normal proc to override set one
9765 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9766 return false;
9767 // Xinef: just to be sure
9768 RemoveAurasDueToSpell(70849);
9769 break;
9770 }
9771
9772 // Xinef: fully remove all auras and reapply once more
9773 RemoveAurasDueToSpell(70849);
9774 RemoveAurasDueToSpell(71072);
9775 RemoveAurasDueToSpell(71069);
9776
9777 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9778 if (trigger_spell_id == 46916)
9779 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9780 else
9781 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9782 }
9783 break;
9784 }
9785 // Sword and Board
9786 case 50227:
9787 {
9788 // Remove cooldown on Shield Slam
9789 if (IsPlayer())
9791 break;
9792 }
9793 // Maelstrom Weapon
9794 case 53817:
9795 {
9796 // have rank dependent proc chance, ignore too often cases
9797 // PPM = 2.5 * (rank of talent),
9798 uint32 rank = auraSpellInfo->GetRank();
9799 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9800 if (!roll_chance_i(20 * rank))
9801 return false;
9802
9803 // Item - Shaman T10 Enhancement 4P Bonus
9804 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9805 if (Aura const* maelstrom = GetAura(53817))
9806 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9807 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9808 CastSpell(this, 70831, true, castItem, triggeredByAura);
9809
9810 break;
9811 }
9812 // Astral Shift
9813 case 52179:
9814 {
9815 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9816 return false;
9817
9818 // Need stun, fear or silence mechanic
9819 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9820 return false;
9821 break;
9822 }
9823 // Glyph of Death's Embrace
9824 case 58679:
9825 {
9826 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9827 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9828 return false;
9829 break;
9830 }
9831 // Glyph of Death Grip
9832 case 58628:
9833 {
9834 // remove cooldown of Death Grip
9835 if (IsPlayer())
9836 ToPlayer()->RemoveSpellCooldown(49576, true);
9837 return true;
9838 }
9839 // Savage Defense
9840 case 62606:
9841 {
9842 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9843 break;
9844 }
9845 // Body and Soul
9846 case 64128:
9847 case 65081:
9848 {
9849 // Proc only from PW:S cast
9850 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9851 return false;
9852 break;
9853 }
9854 // Culling the Herd
9855 case 70893:
9856 {
9857 if (!procSpell)
9858 {
9859 return false;
9860 }
9861 // check if we're doing a critical hit
9862 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9863 return false;
9864 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9865 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9866 return false;
9867 break;
9868 }
9869 // Fingers of Frost, synchronise with Frostbite
9870 case 44544:
9871 {
9872 if (procPhase == PROC_SPELL_PHASE_HIT)
9873 {
9874 // Find Frostbite
9876 {
9877 if (!victim)
9878 return false;
9879
9880 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9881 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9882 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9883
9884 if (roll_chance_i(chance))
9885 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9886 }
9887 }
9888 break;
9889 }
9890 }
9891
9892 // try detect target manually if not set
9893 if (!target)
9894 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9895
9896 if (cooldown)
9897 {
9898 if (HasSpellCooldown(triggerEntry->Id))
9899 return false;
9900
9901 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9902 }
9903
9904 if (basepoints0)
9905 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9906 else
9907 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9908
9909 return true;
9910}
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition SharedDefines.h:808
@ SPELL_ATTR1_NO_THREAT
Definition SharedDefines.h:440
@ MECHANIC_FEAR
Definition SharedDefines.h:1341
@ MECHANIC_SILENCE
Definition SharedDefines.h:1345
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1316
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition SpellMgr.h:244
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_MOONKIN
Definition UnitDefines.h:98
@ FORM_NONE
Definition UnitDefines.h:69
@ FORM_CAT
Definition UnitDefines.h:70
@ FORM_TREE
Definition UnitDefines.h:71
@ FORM_BEAR
Definition UnitDefines.h:74
@ SPELL_HACK_AND_SLASH
Definition Unit.h:294
@ SPELL_SWORD_SPECIALIZATION
Definition Unit.h:293
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition Creature.cpp:2218
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13527
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3543
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1299
Spell const * GetProcSpell() const
Definition Unit.h:450
Unit * GetActor()
Definition Unit.h:441
uint8 GetRank() const
Definition SpellInfo.cpp:2506
uint32 ManaCostPercentage
Definition SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
uint32 ManaCost
Definition SpellInfo.h:363
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition ThreatMgr.cpp:508
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1080
Creature * GetCompanionPet() const
Definition Unit.cpp:10742
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15453
uint32 GetLastExtraAttackSpell() const
Definition Unit.h:988
uint32 GetCreateHealth() const
Definition Unit.h:1074
Unit * GetComboTarget() const
Definition Unit.h:994
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:1079

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4398{
4399 if (thisUnit->SafeUnitPointerSet.empty())
4400 return;
4401 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4402 (*itr)->UnitDeleted();
4403
4404 thisUnit->SafeUnitPointerSet.clear();
4405}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19313{
19314 Creature* creature = ToCreature();
19315 if (creature && creature->IsAIEnabled)
19316 {
19317 if (!creature->AI()->BeforeSpellClick(clicker))
19318 {
19319 return false;
19320 }
19321 }
19322
19323 bool result = false;
19324 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19325 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19326 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19327 {
19329 if (!itr->second.IsFitToRequirements(clicker, this))
19330 continue;
19331
19333 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19334 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19335 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19336 continue;
19337
19338 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19339 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19340 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19341
19342 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19343
19344 // xinef: dont allow players to enter vehicles on arena
19345 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19346 continue;
19347
19348 if (seatId > -1)
19349 {
19350 uint8 i = 0;
19351 bool valid = false;
19352 while (i < MAX_SPELL_EFFECTS)
19353 {
19354 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19355 {
19356 valid = true;
19357 break;
19358 }
19359 ++i;
19360 }
19361
19362 if (!valid)
19363 {
19364 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19365 continue;
19366 }
19367
19368 if (IsInMap(caster))
19369 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19370 else // This can happen during Player::_LoadAuras
19371 {
19373 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19374 bp0[j] = spellInfo->Effects[j].BasePoints;
19375
19376 bp0[i] = seatId;
19377 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19378 }
19379 }
19380 else
19381 {
19382 if (IsInMap(caster))
19383 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19384 else
19385 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19386 }
19387
19388 result = true;
19389 }
19390
19391 if (creature && creature->IsAIEnabled)
19392 creature->AI()->OnSpellClick(clicker, result);
19393
19394 return result;
19395}
#define sConditionMgr
Definition ConditionMgr.h:291
std::list< Condition * > ConditionList
Definition ConditionMgr.h:238
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition SharedDefines.h:702
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition SharedDefines.h:703
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition SharedDefines.h:701
SpellValueMod
Definition SpellDefines.h:112
virtual void OnSpellClick(Unit *, bool &)
Definition CreatureAI.h:207
virtual bool BeforeSpellClick(Unit *)
Definition CreatureAI.h:205
bool IsBattleArena() const
Definition Map.h:302
bool HasAura(AuraType aura) const
Definition SpellInfo.cpp:893
uint32 GetCreatureEntry() const
Definition Vehicle.h:39
Map * FindMap() const
Definition Object.h:622
Definition ConditionMgr.h:183

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15229{
15230 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15231 {
15232 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15233 return false;
15234 }
15235
15236 switch (modifierType)
15237 {
15238 case BASE_VALUE:
15239 case TOTAL_VALUE:
15240 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15241 break;
15242 case BASE_PCT:
15243 case TOTAL_PCT:
15244 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15245 break;
15246 default:
15247 break;
15248 }
15249
15250 if (!CanModifyStats())
15251 return false;
15252
15253 switch (unitMod)
15254 {
15261 break;
15262
15263 case UNIT_MOD_ARMOR:
15264 UpdateArmor();
15265 break;
15266 case UNIT_MOD_HEALTH:
15268 break;
15269
15270 case UNIT_MOD_MANA:
15271 case UNIT_MOD_RAGE:
15272 case UNIT_MOD_FOCUS:
15273 case UNIT_MOD_ENERGY:
15274 case UNIT_MOD_HAPPINESS:
15275 case UNIT_MOD_RUNE:
15278 break;
15279
15287 break;
15288
15291 break;
15294 break;
15295
15298 break;
15301 break;
15304 break;
15305
15306 default:
15307 break;
15308 }
15309
15310 return true;
15311}
@ UNIT_MOD_ARMOR
Definition Unit.h:158
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:165
@ UNIT_MOD_HEALTH
Definition Unit.h:150
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:169
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:167
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:166
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15370
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15402
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15431
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition Unit.h:1059
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1451 {
1452 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1453 return HasAuras(SearchMethod::MatchAll, spellList);
1454 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition Unit.cpp:5766

References HasAuras(), and MatchAll.

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:5796

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5790{
5791 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5792 return true;
5793 return false;
5794}

References GetAuraApplication().

Referenced by at_hol_hall_of_watchers::_OnTrigger(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyItemObtainSpells(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_jenny::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_tenris_mirkblood::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), Spell::finish(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_braziers_hit::HandleAfterEffectApply(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), HasAuras(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), boss_krik_thir::boss_krik_thirAI::IsInFrenzy(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_necropolis::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_dark_fiend::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5737{
5738 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5739 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5740 {
5741 if (itr->second->HasEffect(effIndex)
5742 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5743 {
5744 return true;
5745 }
5746 }
5747 return false;
5748}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5767{
5768 if (sm == SearchMethod::MatchAll)
5769 {
5770 for (auto const& spellId : spellIds)
5771 if (!HasAura(spellId))
5772 return false;
5773 return true;
5774 }
5775 else if (sm == SearchMethod::MatchAny)
5776 {
5777 for (auto const& spellId : spellIds)
5778 if (HasAura(spellId))
5779 return true;
5780 return false;
5781 }
5782 else
5783 {
5784 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5785 return false;
5786 }
5787}

References HasAura(), LOG_ERROR, MatchAll, and MatchAny.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10624{
10625 if (Caster)
10626 {
10627 if (spellProto)
10628 {
10629 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10630 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10631 if ((*j)->IsAffectedOnSpell(spellProto))
10632 return true;
10633 }
10634 // Check per caster aura state
10635 // If aura with aurastate by caster not found return false
10636 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10637 {
10638 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10639 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10640 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10641 return true;
10642 return false;
10643 }
10644 }
10645
10646 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10647}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition Unit.h:664

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5797{
5798 return (!m_modAuras[auraType].empty());
5799}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), HasWaterWalkAura(), Player::IsFreeFlying(), and Player::SendInitialPacketsAfterAddToMap().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5830{
5831 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5832 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5833 if ((*i)->IsAffectedOnSpell(affectedSpell))
5834 return true;
5835 return false;
5836}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5802{
5803 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5804 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5805 if (caster == (*i)->GetCasterGUID())
5806 return true;
5807 return false;
5808}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
780{
781 if (!HasAuraType(auraType))
782 return false;
783 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
784 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
785 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
786 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
787 return true;
788 return false;
789}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5821{
5822 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5823 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5824 if (miscvalue == (*i)->GetMiscValue())
5825 return true;
5826 return false;
5827}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5848{
5849 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5850 {
5851 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5852 {
5853 return true;
5854 }
5855 }
5856
5857 return false;
5858}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5839{
5840 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5841 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5842 if (value == (*i)->GetAmount())
5843 return true;
5844 return false;
5845}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5884{
5885 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5886 {
5887 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5888 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5889 return true;
5890
5891 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5892 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5893 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5894 return true;
5895 }
5896
5897 return false;
5898}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
792{
793 AuraEffectList const& auras = GetAuraEffectsByType(type);
794 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
795 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
796 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
797 return true;
798 return false;
799}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
802{
803 uint32 excludeAura = 0;
804 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
805 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
806
812}
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition Unit.cpp:791
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1535

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::GetAurasForTarget(), and Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1757{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::GetAurasForTarget(), Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasLeewayMovement()

bool Unit::HasLeewayMovement ( ) const
inline
1685 {
1687 && !IsWalking();
1688 }
@ MOVEMENTFLAG_STRAFE_LEFT
Definition UnitDefines.h:371
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition UnitDefines.h:372
bool IsWalking() const
Definition Unit.h:1662
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346

References MovementInfo::HasMovementFlag(), IsWalking(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, and MOVEMENTFLAG_STRAFE_RIGHT.

Referenced by Spell::CheckRange(), and IsWithinMeleeRange().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
961{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:966

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5873{
5874 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5875 {
5876 Aura const* aura = iter->second->GetBase();
5877 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5878 return true;
5879 }
5880 return false;
5881}
uint32 Attributes
Definition SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5861{
5862 if (!(m_interruptMask & flag))
5863 return false;
5864 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5865 {
5866 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5867 return true;
5868 }
5869 return false;
5870}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
962{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
963{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

References HasAuraType(), and SPELL_AURA_MOD_ROOT.

Referenced by SetControlled().

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1303{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

bool Unit::HasStunAura ( ) const
inline

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
732{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), CreatureGroup::LeaderMoveTo(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), MotionMaster::MoveWaypoint(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), WorldSession::ProcessMovementInfo(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_anub_arak::boss_anub_arakAI::SummonedCreatureDies(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and WorldSession::VerifyMovementInfo().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
721{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), SmartAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), boss_krik_thir::boss_krik_thirAI::boss_krik_thirAI(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_taldaram::boss_taldaram(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_tenris_mirkblood::boss_tenris_mirkblood(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), BossAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), IsImmobilizedState(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), Creature::IsUpdateNeeded(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), BossAI::OnSpellCastFinished(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), ThreatContainer::SelectNextVictim(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetInCombatState(), SetInFront(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Creature::Update(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::UpdateAI(), boss_ionar::UpdateAI(), boss_loken::UpdateAI(), boss_volkhan::UpdateAI(), npc_molten_golem::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_enslaved_netherwing_drake::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5811{
5812 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5813 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5814 if ((*i)->GetBase()->CanBeSentToClient())
5815 return true;
5816
5817 return false;
5818}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

966{ return CanUseAttackType(type); }
bool CanUseAttackType(WeaponAttackType attacktype) const
Definition Unit.h:970

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
523{
524 if (Player const* player = ToPlayer())
525 return player->GetWeaponForAttack(OFF_ATTACK, true);
526
527 return CanDualWield();
528}
bool CanDualWield() const
Definition Unit.h:956

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11318{
11319 uint32 heal = healInfo.GetHeal();
11320 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11321 healInfo.SetHeal(heal);
11322
11323 // calculate heal absorb and reduce healing
11324 CalcHealAbsorb(healInfo);
11325
11326 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11327 healInfo.SetEffectiveHeal(gain);
11328
11329 SendHealSpellLog(healInfo, critical);
11330 return gain;
11331}
Unit * GetHealer() const
Definition Unit.h:412
void SetHeal(uint32 amount)
Definition Unit.h:402
void SetEffectiveHeal(uint32 amount)
Definition Unit.h:407
static void CalcHealAbsorb(HealInfo &healInfo)
Definition Unit.cpp:2537
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition Unit.cpp:11027
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition Unit.cpp:11300

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1078{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1079{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15059{
15060 // Checking for existing in the table
15061 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15062 {
15063 if (i->DRGroup != group)
15064 continue;
15065 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15066 i->hitCount += 1;
15067 return;
15068 }
15070}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition SpellMgr.cpp:264
Definition Unit.h:274

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15823{
15824 if (!m_charmInfo)
15825 m_charmInfo = new CharmInfo(this);
15826
15827 return m_charmInfo;
15828}
Definition CharmInfo.h:127

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1048 {
1049 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1050 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1051 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17418{
17419 Player* player = ToPlayer();
17420 PetStable& petStable = player->GetOrInitPetStable();
17421 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17422 return false;
17423
17424 pet->SetCreatorGUID(GetGUID());
17425 pet->SetFaction(GetFaction());
17426 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17427
17428 if (IsPlayer())
17430
17431 if (!pet->InitStatsForLevel(level))
17432 {
17433 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17434 return false;
17435 }
17436
17437 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17438 // this enables pet details window (Shift+P)
17439 pet->InitPetCreateSpells();
17440 pet->SetFullHealth();
17441 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17442 return true;
17443}
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
Definition PetDefines.h:212
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:240
Optional< PetInfo > CurrentPet
Definition PetDefines.h:235
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2477
void InitPetCreateSpells()
Definition Pet.cpp:2052
PetStable & GetOrInitPetStable()
Definition Player.cpp:15700
void SetFullHealth()
Definition Unit.h:1088
void SetFaction(uint32 faction)
Definition Unit.cpp:10107
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition Unit.h:735
CharmInfo * GetCharmInfo()
Definition Unit.h:1248
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:701
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom(), and CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4189{
4190 // generic spells are interrupted if they are not finished or delayed
4191 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4192 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4193
4194 // autorepeat spells are interrupted if they are not finished or delayed
4195 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4196 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4197
4198 // channeled spells are interrupted if they are not finished, even if they are delayed
4199 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4200 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4201}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_shade_of_aran::JustEngagedWith(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4117{
4118 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4119 Spell* spell = m_currentSpells[spellType];
4120 if (spell
4121 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4122 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4123 {
4124 // for example, do not let self-stun aura interrupt itself
4125 if (!spell->IsInterruptable())
4126 return;
4127
4128 // send autorepeat cancel message for autorepeat spells
4129 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4130 if (IsPlayer())
4132
4133 if (spell->getState() != SPELL_STATE_FINISHED)
4134 spell->cancel(bySelf);
4135 else
4136 {
4137 m_currentSpells[spellType] = nullptr;
4138 spell->SetReferencedFromCurrent(false);
4139 }
4140
4141 if (IsCreature() && IsAIEnabled)
4143 }
4144}
@ SPELL_FINISHED_CANCELED
Definition Spell.h:99
@ SPELL_STATE_DELAYED
Definition Spell.h:239
virtual void OnSpellCastFinished(SpellInfo const *, SpellFinishReason)
Definition CreatureAI.h:151
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
bool IsInterruptable() const
Definition Spell.h:572
int32 GetCastTime() const
Definition Spell.h:558
uint32 getState() const
Definition Spell.h:493
void cancel(bool bySelf=false)
Definition Spell.cpp:3636

References Creature::AI(), Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::GetSpellInfo(), Spell::getState(), IsAIEnabled, Object::IsCreature(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, CreatureAI::OnSpellCastFinished(), Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_FINISHED_CANCELED, SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, Object::ToCreature(), and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2181{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1748{ return (m_deathState == DeathState::Alive); };

References Alive, and m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Battleground::AddPlayer(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), npc_kiljaeden_controller::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), SmartScript::ProcessAction(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), SetFeared(), SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14299{
14301 return true;
14302
14303 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14304 return true;
14305
14306 if (Player* ownerPlayer = GetSpellModOwner())
14307 if (Player const* seerPlayer = seer->ToPlayer())
14308 {
14309 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14310 return true;
14311 }
14312
14313 return false;
14314}
@ SPELL_AURA_MOD_STALKED
Definition SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition Object.h:760

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14280{
14282 return true;
14283
14284 // Always seen by owner
14285 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14286 if (seer->GetGUID() == guid)
14287 return true;
14288
14289 if (Player const* seerPlayer = seer->ToPlayer())
14290 if (Unit* owner = GetOwner())
14291 if (Player* ownerPlayer = owner->ToPlayer())
14292 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14293 return true;
14294
14295 return false;
14296}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition Object.h:757

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition UnitDefines.h:331
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:748

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10539{
10541 return true;
10542
10543 if (!m_Controlled.empty())
10544 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10545 if ((*itr)->isAttackingPlayer())
10546 return true;
10547
10548 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10549 if (m_SummonSlot[i])
10550 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10551 if (summon->isAttackingPlayer())
10552 return true;
10553
10554 return false;
10555}
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2364

References Map::GetCreature(), WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19273{
19274 // Mirroring clientside gameplay logic
19275 if (ShapeshiftForm form = GetShapeshiftForm())
19276 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19277 return entry->attackSpeed > 0;
19278
19279 return false;
19280}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition UnitDefines.h:340

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition UnitDefines.h:336

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

687{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3164{
3166 return true;
3167 return false;
3168}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline

◆ IsClass()

◆ IsClientControlled()

bool Unit::IsClientControlled ( Player const *  exactClient = nullptr) const
21226{
21227 // Severvide method to check if unit is client controlled (optionally check for specific client in control)
21228
21229 // Applies only to player controlled units
21231 return false;
21232
21233 // These flags are meant to be used when server controls this unit, client control is taken away
21235 return false;
21236
21237 // If unit is possessed, it has lost original control...
21238 if (ObjectGuid const& guid = GetCharmerGUID())
21239 {
21240 // ... but if it is a possessing charm, then we have to check if some other player controls it
21241 if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_POSSESSED) && guid.IsPlayer())
21242 return (exactClient ? (exactClient->GetGUID() == guid) : true);
21243 return false;
21244 }
21245
21246 // By default: players have client control over themselves
21247 if (IsPlayer())
21248 return (exactClient ? (exactClient == this) : true);
21249 return false;
21250}
@ UNIT_FLAG_CONFUSED
Definition UnitDefines.h:276
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:256
@ UNIT_FLAG_FLEEING
Definition UnitDefines.h:277

References GetCharmerGUID(), Object::GetGUID(), Object::HasFlag(), Object::IsPlayer(), UNIT_FIELD_FLAGS, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_FLEEING, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_FLAG_POSSESSED.

Referenced by GetClientControlling(), SetCanFly(), SetDisableGravity(), SetFeatherFall(), SetHover(), SetSpeed(), and SetWaterWalking().

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
1008 {
1009 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1010 return entry->IsContestedGuardFaction();
1011
1012 return false;
1013 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1275{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsCrowdControlled()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2044{
2045 // only physical spells damage gets reduced by armor
2046 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2047 return false;
2048 if (spellInfo)
2049 {
2050 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2051 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2052 return false;
2053
2054 // bleeding effects are not reduced by armor
2055 if (effIndex != MAX_SPELL_EFFECTS)
2056 {
2057 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2058 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2059 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2060 return false;
2061 }
2062 }
2063 return true;
2064}
@ MECHANIC_BLEED
Definition SharedDefines.h:1351
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition SpellInfo.h:191

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline

References Corpse, Dead, and m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1749{ return (m_deathState == DeathState::JustDied); };

References JustDied, and m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10293{
10294 return GetReactionTo(unit) >= REP_FRIENDLY;
10295}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:319

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition UnitDefines.h:337

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10298{
10299 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10300 if (!my_faction || !my_faction->faction)
10301 return false;
10302
10303 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10304 if (raw_faction && raw_faction->reputationListID >= 0)
10305 return false;
10306
10307 return my_faction->IsHostileToPlayers();
10308}
int32 reputationListID
Definition DBCStructure.h:909
uint32 faction
Definition DBCStructure.h:941
bool IsHostileToPlayers() const
Definition DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

bool Unit::IsHovering ( ) const
inline

◆ IsHunterPet()

◆ IsImmobilizedState()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12871{
12872 SpellInfo const* spellInfo = spell->GetSpellInfo();
12873 if (!spellInfo)
12874 {
12875 return false;
12876 }
12877
12879 {
12880 return false;
12881 }
12882
12884 {
12885 return false;
12886 }
12887
12888 uint32 schoolMask = spell->GetSpellSchoolMask();
12889 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12890 {
12891 return false;
12892 }
12893
12894 // If m_immuneToDamage type contain magic, IMMUNE damage.
12895 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12896 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12897 {
12898 if ((itr->type & schoolMask) == schoolMask)
12899 {
12900 return true;
12901 }
12902 }
12903
12904 return false;
12905}
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition SharedDefines.h:493
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition SharedDefines.h:446
@ IMMUNITY_DAMAGE
Definition SharedDefines.h:1408
@ SPELL_SCHOOL_MASK_NONE
Definition SharedDefines.h:307
std::vector< SpellImmune > SpellImmuneList
Definition SpellDefines.h:182

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12839{
12840 if (!spellInfo)
12841 {
12842 return false;
12843 }
12844
12845 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12846 {
12847 return false;
12848 }
12849
12850 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12851 {
12852 return false;
12853 }
12854
12855 uint32 schoolMask = spellInfo->GetSchoolMask();
12856 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12857 {
12858 return false;
12859 }
12860
12861 // If m_immuneToDamage type contain magic, IMMUNE damage.
12862 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12863 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12864 if ((itr->type & schoolMask) == schoolMask)
12865 return true;
12866
12867 return false;
12868}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12823{
12824 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12825 {
12826 return false;
12827 }
12828
12829 // If m_immuneToDamage type contain magic, IMMUNE damage.
12830 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12831 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12832 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12833 return true;
12834
12835 return false;
12836}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12987{
12988 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12989}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12907
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12822

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12947{
12948 SpellInfo const* spellInfo = spell->GetSpellInfo();
12950 {
12951 return false;
12952 }
12953
12954 uint32 schoolMask = spell->GetSpellSchoolMask();
12955 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12956 {
12957 return false;
12958 }
12959
12960 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12961 {
12962 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12963 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12964 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12965 {
12966 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12967 {
12968 return true;
12969 }
12970 }
12971 }
12972
12973 return false;
12974}
@ IMMUNITY_SCHOOL
Definition SharedDefines.h:1407
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12924{
12925 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12926 return false;
12927
12928 uint32 schoolMask = spellInfo->GetSchoolMask();
12929 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12930 {
12931 return false;
12932 }
12933
12934 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12935 {
12936 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12937 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12938 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12939 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12940 return true;
12941 }
12942
12943 return false;
12944}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12908{
12909 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12910 {
12911 return false;
12912 }
12913
12914 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12915 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12916 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12917 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12918 return true;
12919
12920 return false;
12921}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), IsImmunedToDamageOrSchool(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

12992{
12993 if (!spellInfo)
12994 return false;
12995
12996 // Single spell immunity.
12997 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
12998 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
12999 if (itr->type == spellInfo->Id)
13000 return true;
13001
13002 // xinef: my special immunity, if spellid is not on this list it means npc is immune
13003 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
13004 if (!allowIdList.empty())
13005 {
13006 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
13007 if (itr->type == spellInfo->Id)
13008 return false;
13009 return true;
13010 }
13011
13012 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13013 return false;
13014
13015 if (spellInfo->Dispel)
13016 {
13017 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
13018 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
13019 if (itr->type == spellInfo->Dispel)
13020 return true;
13021 }
13022
13023 // Spells that don't have effectMechanics.
13024 if (spellInfo->Mechanic)
13025 {
13026 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13027 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13028 if (itr->type == spellInfo->Mechanic)
13029 return true;
13030 }
13031
13032 bool immuneToAllEffects = true;
13033 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13034 {
13035 // State/effect immunities applied by aura expect full spell immunity
13036 // Ignore effects with mechanic, they are supposed to be checked separately
13037 if (!spellInfo->Effects[i].IsEffect())
13038 continue;
13039
13040 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13041 if (IsImmunedToSpellEffect(spellInfo, i))
13042 {
13043 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13044 return true;
13045 continue;
13046 }
13047
13048 immuneToAllEffects = false;
13049 break;
13050 }
13051 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13052 return true;
13053
13054 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13055 {
13056 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13057 if (spell)
13058 {
13059 spellSchoolMask = spell->GetSpellSchoolMask();
13060 }
13061
13062 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13063 {
13064 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13065 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13066 {
13067 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13068 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13069 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13070 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13071 {
13072 return true;
13073 }
13074 }
13075 }
13076 }
13077
13078 return false;
13079}
@ IMMUNITY_ALLOW_ID
Definition SharedDefines.h:1412
@ IMMUNITY_ID
Definition SharedDefines.h:1411
@ IMMUNITY_MECHANIC
Definition SharedDefines.h:1410

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13082{
13083 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13084 return false;
13085
13086 // xinef: pet scaling auras
13087 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13088 return false;
13089
13090 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13091 return false;
13092
13093 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13094 uint32 effect = spellInfo->Effects[index].Effect;
13095 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13096 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13097 {
13098 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13099 {
13100 return true;
13101 }
13102 }
13103
13104 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13105 {
13106 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13107 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13108 if (itr->type == mechanic)
13109 return true;
13110 }
13111
13112 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13113 {
13115 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13116 {
13117 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13118 {
13119 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13120 {
13121 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13122 {
13123 return true;
13124 }
13125 }
13126 }
13127 }
13128
13129 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13130 {
13131 // Check for immune to application of harmful magical effects
13133 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13134 {
13135 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13136 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13137 !spellInfo->IsPositiveEffect(index) && // Harmful
13138 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13139 {
13140 return true;
13141 }
13142 }
13143 }
13144 }
13145
13146 return false;
13147}
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition SharedDefines.h:816
@ SPELL_ATTR3_ALWAYS_HIT
Definition SharedDefines.h:522
@ IMMUNITY_STATE
Definition SharedDefines.h:1406
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1405
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition SharedDefines.h:566
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition SpellDefines.h:159
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition Unit.cpp:21110

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
908{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4262{
4263 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4264 {
4265 // skip transport check, check for being below floor level
4266 if (this->GetPositionZ() < 28.0f)
4267 return false;
4268 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4269 if (Battleground* bg = bgMap->GetBG())
4270 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4271 return false;
4272 }
4273 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4274 {
4275 // if static transport doesn't match - return false
4276 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4277 return false;
4278
4279 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4280 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4281 {
4282 if (c->GetTransport() != this->GetTransport())
4283 return false;
4284 if (this->GetTransport())
4285 {
4286 if (c->GetPositionY() < 2033.0f)
4287 {
4288 if (this->GetPositionY() > 2033.0f)
4289 return false;
4290 }
4291 else if (c->GetPositionY() < 2438.0f)
4292 {
4293 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4294 return false;
4295 }
4296 else if (this->GetPositionY() < 2438.0f)
4297 return false;
4298 }
4299 }
4300 }
4301 else
4302 {
4303 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4304 if (c->GetTransport() != this->GetTransport())
4305 return false;
4306 }
4307
4308 LiquidStatus liquidStatus = GetLiquidData().Status;
4309 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4310
4311 // In water or jumping in water
4312 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4313 {
4314 return c->CanEnterWater();
4315 }
4316 else
4317 {
4318 return c->CanWalk() || c->CanFly();
4319 }
4320}
@ MAP_THE_RING_OF_VALOR
Definition AreaDefines.h:261
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:265
LiquidStatus
Definition GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
Definition Map.h:680
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:380
bool IsFalling() const
Definition Unit.cpp:19713
LiquidData const & GetLiquidData() const
Definition Object.cpp:3096
LiquidStatus Status
Definition GridTerrainData.h:206

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), spell_chapter5_return_to_capital::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), Creature::IsUpdateNeeded(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), npc_kiljaeden_controller::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_muru::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), BossAI::OnSpellCastFinished(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
20917{
20918 // Check target exists
20919 if (!who)
20920 return false;
20921 // Search in threat list
20922 ObjectGuid guid = who->GetGUID();
20923 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
20924 {
20925 HostileReference* ref = (*i);
20926 // Return true if the unit matches
20927 if (ref && ref->getUnitGuid() == guid)
20928 return true;
20929 }
20930 // Nothing found, false.
20931 return false;
20932}
Definition ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition ThreatMgr.h:273

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21146{
21147 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21148 {
21149 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21150 {
21151 return false;
21152 }
21153 }
21154
21155 if (ShapeshiftForm form = GetShapeshiftForm())
21156 {
21157 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21158 if (!shapeshift)
21159 {
21160 return true;
21161 }
21162
21163 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21164 {
21165 return true;
21166 }
21167 }
21168
21170 {
21171 return false;
21172 }
21173
21174 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21175 if (!display)
21176 {
21177 return true;
21178 }
21179
21181 if (!displayExtra)
21182 {
21183 return true;
21184 }
21185
21186 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21187 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21188
21189 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21190 {
21191 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21192 {
21193 return true;
21194 }
21195 }
21196
21197 return false;
21198}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition SharedDefines.h:417
@ SHAPESHIFT_FLAG_STANCE
Definition UnitDefines.h:104
uint32 getTransForm() const
Definition Unit.h:1922
bool HasFlag(ChrRacesFlags flag) const
Definition DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition DBCStructure.h:725
uint32 DisplayRaceID
Definition DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition DBCStructure.h:804
uint32 flags1
Definition DBCStructure.h:1823

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SHAPESHIFT_FLAG_STANCE, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4252{
4253 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4254}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition UnitDefines.h:335

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18802{
18803 if (this == unit)
18804 return true;
18805
18806 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18807 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18808 if (u1 == u2)
18809 return true;
18810
18811 if (u1->IsPlayer() && u2->IsPlayer())
18812 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18813 // Xinef: we assume that npcs with the same faction are in party
18814 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18815 return u1->GetFaction() == u2->GetFaction();
18816 // Xinef: creature type_flag should work for party check only if player group is not a raid
18819 return true;
18820 else
18821 return false;
18822}
bool isRaidGroup() const
Definition Group.cpp:2281
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2307

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18825{
18826 if (this == unit)
18827 return true;
18828
18829 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18830 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18831 if (u1 == u2)
18832 return true;
18833
18834 if (u1->IsPlayer() && u2->IsPlayer())
18835 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18836 // Xinef: we assume that npcs with the same faction are in party
18837 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18838 return u1->GetFaction() == u2->GetFaction();
18841 return true;
18842 else
18843 return false;
18844}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4228{
4229 // can always move when not casting
4231 {
4232 return false;
4233 }
4234
4235 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4237 {
4238 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4239 {
4240 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4241 {
4242 return false;
4243 }
4244 }
4245 }
4246
4247 // prohibit movement for all other spell casts
4248 return true;
4249}
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10311{
10312 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10313 if (!my_faction || !my_faction->faction)
10314 return true;
10315
10316 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10317 if (raw_faction && raw_faction->reputationListID >= 0)
10318 return false;
10319
10320 return my_faction->IsNeutralToAll();
10321}
bool IsNeutralToAll() const
Definition DBCStructure.h:982

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4159{
4160 // We don't do loop here to explicitly show that melee spell is excluded.
4161 // Maybe later some special spells will be excluded too.
4162
4163 // generic spells are cast when they are not finished and not delayed
4166 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4167 {
4168 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4169 {
4170 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4171 return true;
4172 }
4173 }
4174 // channeled spells may be delayed, but they are still considered cast
4175 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4177 {
4178 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4179 return true;
4180 }
4181 // autorepeat spells may be finished or delayed, but they are still considered cast
4182 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4183 return true;
4184
4185 return false;
4186}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition SharedDefines.h:484

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
780{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17359{
17360 Unit* owner = GetOwner();
17361
17362 if (!owner || !owner->IsPlayer())
17363 return false;
17364
17365 // if the owner has that pet aura, return true
17366 for (PetAura const* petAura : owner->m_petAuras)
17367 if (petAura->GetAura(GetEntry()) == aura->GetId())
17368 return true;
17369
17370 return false;
17371}
Definition SpellMgr.h:470
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:236

References Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16764{
16765 uint32 transformId = getTransForm();
16766 if (!transformId)
16767 return false;
16768
16769 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16770 if (!spellInfo)
16771 return false;
16772
16773 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16774}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition SpellInfo.cpp:2149

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1281 {
1282 if (Unit* u = GetCharm())
1283 return u->isPossessed();
1284 else
1285 return false;
1286 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1287{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition Unit.h:1278

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:320

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsRooted()

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5901{
5903 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5904 {
5905 if ((*i)->GetMiscValue() == script)
5906 if ((*i)->IsAffectedOnSpell(spell))
5907 return (*i);
5908 }
5909 return nullptr;
5910}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16725{
16726 uint8 s = getStandState();
16727 return
16731}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3138{
3139 // These spells can't be blocked
3140 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3141 return false;
3142
3143 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3144 {
3145 // Check creatures flags_extra for disable block
3146 if (victim->IsCreature() &&
3148 return false;
3149
3150 float blockChance = victim->GetUnitBlockChance();
3151 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3152
3153 // xinef: cant block while casting or while stunned
3154 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3155 blockChance = 0.0f;
3156
3157 if (roll_chance_f(blockChance))
3158 return true;
3159 }
3160 return false;
3161}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition SharedDefines.h:414
@ UNIT_STATE_CONTROLLED
Definition UnitDefines.h:215
bool HasIgnoreHitDirectionAura() const
Definition Unit.h:1767
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3827
float GetUnitBlockChance() const
Definition Unit.cpp:3739

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStandUpOnMovementState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline
1717{ return !(HasUnitState(UNIT_STATE_MOVING)); }
@ UNIT_STATE_MOVING
Definition UnitDefines.h:214

References HasUnitState(), and UNIT_STATE_MOVING.

Referenced by RotateMovementGenerator::Initialize(), IdleMovementGenerator::Reset(), and SetFacingToObject().

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17446{
17447 SpellInfo const* spellProto = aura->GetSpellInfo();
17448 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17449
17450 // let the aura be handled by new proc system if it has new entry
17451 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17452 return false;
17453
17454 // Get proc Event Entry
17455 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17456
17457 // Get EventProcFlag
17458 uint32 EventProcFlag;
17459 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17460 EventProcFlag = spellProcEvent->procFlags;
17461 else
17462 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17463 // Continue if no trigger exist
17464 if (!EventProcFlag)
17465 return false;
17466
17467 // Additional checks for triggered spells (ignore trap casts)
17468 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17469 {
17471 return false;
17472 }
17473
17474 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17475 // Xinef: skip victim auras
17476 // Excluded player shoot spells
17477 // Excluded player item spells
17478 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17479 {
17480 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17481 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17482 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17483 {
17484 return false;
17485 }
17486 }
17487
17488 // Check spellProcEvent data requirements
17489 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17490 return false;
17491 // In most cases req get honor or XP from kill
17492 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17493 {
17494 bool allow = false;
17495
17496 if (victim)
17497 allow = ToPlayer()->isHonorOrXPTarget(victim);
17498
17499 // Shadow Word: Death - can trigger from every kill
17500 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17501 allow = true;
17502 if (!allow)
17503 return false;
17504 }
17505 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17506 // But except periodic and kill triggers (can triggered from self)
17507 if (procSpell && procSpell->Id == spellProto->Id
17508 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17509 return false;
17510
17511 // Check if current equipment allows aura to proc
17512 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17513 {
17514 Player* player = ToPlayer();
17515 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17516 {
17517 Item* item = nullptr;
17518 if (attType == BASE_ATTACK)
17520 else if (attType == OFF_ATTACK)
17522 else
17524
17525 if (player->IsInFeralForm())
17526 return false;
17527
17528 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17529 return false;
17530 }
17531 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17532 {
17533 // Check if player is wearing shield
17535 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17536 return false;
17537 }
17538 }
17539 // Get chance from spell
17540 float chance = float(spellProto->ProcChance);
17541 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17542 if (spellProcEvent && spellProcEvent->customChance)
17543 chance = spellProcEvent->customChance;
17544 // If PPM exist calculate chance from PPM
17545 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17546 {
17547 uint32 attackSpeed = 0;
17548 Unit* attacker = nullptr;
17549 if (!isVictim)
17550 attacker = this;
17551 else if (victim)
17552 attacker = victim;
17553
17554 if (attacker)
17555 {
17556 if (!procSpell || procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE || procSpell->IsRangedWeaponSpell())
17557 {
17558 attackSpeed = attacker->GetAttackTime(attType);
17559 }
17560 else //spells user their casttime for ppm calculations
17561 {
17562 if (procSpell->CastTimeEntry)
17563 attackSpeed = procSpell->CastTimeEntry->CastTime;
17564
17565 //instants and fast spells use 1.5s castspeed
17566 if (attackSpeed < 1500)
17567 attackSpeed = 1500;
17568 }
17569 }
17570 chance = GetPPMProcChance(attackSpeed, spellProcEvent->ppmRate, spellProto);
17571 }
17572
17573 // Custom chances
17574 switch (spellProto->SpellFamilyName)
17575 {
17577 {
17578 // Recklessness, allow to proc only once for whirlwind
17579 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17580 return false;
17581 }
17582 }
17583
17584 if (eventInfo.GetProcChance())
17585 {
17586 chance = *eventInfo.GetProcChance();
17587 }
17588
17589 // Apply chance modifer aura
17590 if (Player* modOwner = GetSpellModOwner())
17591 {
17592 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17593 }
17594
17595 return roll_chance_f(chance);
17596}
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:687
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition SharedDefines.h:505
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition SharedDefines.h:530
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ PROC_EX_INTERNAL_TRIGGERED
Definition SpellMgr.h:221
@ PROC_FLAG_DEATH
Definition SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition SpellMgr.h:135
@ PROC_FLAG_KILL
Definition SpellMgr.h:108
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition SpellMgr.h:138
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1250
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12719
uint32 GetCategory() const
Definition SpellInfo.cpp:871
int32 EquippedItemClass
Definition SpellInfo.h:375
uint32 ProcFlags
Definition SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition SpellInfo.h:376
SpellCastTimesEntry const * CastTimeEntry
Definition SpellInfo.h:347
uint32 DmgClass
Definition SpellInfo.h:389
bool IsRangedWeaponSpell() const
Definition SpellInfo.cpp:1276
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13526
uint32 Class
Definition ItemTemplate.h:621
int32 CastTime
Definition DBCStructure.h:1761

References BASE_ATTACK, SpellCastTimesEntry::CastTime, SpellInfo::CastTimeEntry, ItemTemplate::Class, SpellProcEventEntry::customChance, SpellInfo::DmgClass, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELL_DAMAGE_CLASS_MELEE, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4413{
4415}
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14079{
14080 return _IsValidAssistTarget(target, nullptr);
14081}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:14084

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13956{
13957 return _IsValidAttackTarget(target, bySpell);
13958}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), npc_pet_dk_army_of_the_dead::IsSummonedBy(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1284
T_VALUES GetValue(FLAG_TYPE flag) const
Definition Object.h:394

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinBoundaryRadius()

bool Unit::IsWithinBoundaryRadius ( const Unit obj) const
705{
706 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
707 return false;
708
709 float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
710
711 return IsInDist(obj, objBoundaryRadius);
712}
float GetBoundaryRadius() const
Definition Unit.h:859
bool IsInDist(float x, float y, float z, float dist) const
Definition Position.h:221

References GetBoundaryRadius(), WorldObject::InSamePhase(), Position::IsInDist(), WorldObject::IsInMap(), and MIN_MELEE_REACH.

Referenced by Spell::CheckRange(), Acore::WorldObjectSpellConeTargetCheck::operator()(), and Player::Update().

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
666{
667 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
668 return false;
669
670 float dx = GetPositionX() - obj->GetPositionX();
671 float dy = GetPositionY() - obj->GetPositionY();
672 float dz = GetPositionZ() - obj->GetPositionZ();
673 float distsq = dx * dx + dy * dy + dz * dz;
674
675 float maxdist = dist + GetMeleeRange(obj);
676
677 if ((IsPlayer() || obj->IsPlayer()) && HasLeewayMovement() && obj->HasLeewayMovement())
678 maxdist += LEEWAY_BONUS_RANGE;
679
680 return distsq < maxdist * maxdist;
681}
#define LEEWAY_BONUS_RANGE
Definition ObjectDefines.h:51
bool HasLeewayMovement() const
Definition Unit.h:1684

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasLeewayMovement(), WorldObject::InSamePhase(), WorldObject::IsInMap(), Object::IsPlayer(), and LEEWAY_BONUS_RANGE.

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), SmartAI::DistanceYourself(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), ChaseMovementGenerator< T >::DoUpdate(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
690{
691 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
692 {
693 return false;
694 }
695
696 auto dx = GetPositionX() - obj->GetPositionX();
697 auto dy = GetPositionY() - obj->GetPositionY();
698 auto dz = GetPositionZ() - obj->GetPositionZ();
699 auto distsq = dx * dx + dy * dy + dz * dz;
700
701 return distsq <= dist * dist;
702}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19283{
19284 float angle = forward ? 0 : M_PI;
19285 if (IsCreature())
19286 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19287 else
19288 {
19289 float vcos = cos(angle + GetOrientation());
19290 float vsin = std::sin(angle + GetOrientation());
19291
19292 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19293 data << GetPackGUID();
19294 data << uint32(0); // Sequence
19295 data << float(vcos); // x direction
19296 data << float(vsin); // y direction
19297 data << float(speedXY); // Horizontal speed
19298 data << float(-speedZ); // Z Movement speed (vertical)
19299
19300 ToPlayer()->SendDirectMessage(&data);
19301 }
19302}
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition MotionMaster.cpp:636
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5711
@ SMSG_MOVE_KNOCK_BACK
Definition Opcodes.h:269

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Object::IsCreature(), MotionMaster::MoveJumpTo(), Player::SendDirectMessage(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19305{
19306 float x, y, z;
19307 obj->GetContactPoint(this, x, y, z);
19308 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19309 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19310}
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition MotionMaster.h:244
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2760

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17739{
17740 // Prevent killing unit twice (and giving reward from kill twice)
17741 if (!victim->GetHealth())
17742 return;
17743
17744 if (killer && !killer->IsInMap(victim))
17745 killer = nullptr;
17746
17747 // find player: owner of controlled `this` or `this` itself maybe
17748 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17749 Creature* creature = victim->ToCreature();
17750
17751 bool isRewardAllowed = true;
17752 if (creature)
17753 {
17754 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17755 if (!isRewardAllowed)
17756 creature->SetLootRecipient(nullptr);
17757 }
17758
17759 // pussywizard: remade this if section (player is on the same map
17760 if (isRewardAllowed && creature)
17761 {
17762 Player* lr = creature->GetLootRecipient();
17763 if (lr && lr->IsInMap(creature))
17764 player = creature->GetLootRecipient();
17765 else if (Group* lrg = creature->GetLootRecipientGroup())
17766 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17767 if (Player* member = itr->GetSource())
17768 if (member->IsAtLootRewardDistance(creature))
17769 {
17770 player = member;
17771 break;
17772 }
17773 }
17774
17775 // Exploit fix
17776 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17777 isRewardAllowed = false;
17778
17779 // Reward player, his pets, and group/raid members
17780 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17781 if (isRewardAllowed && player && player != victim)
17782 {
17783 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17784 data << player->GetGUID(); // player with killing blow
17785 data << victim->GetGUID(); // victim
17786
17787 Player* looter = player;
17788 Group* group = player->GetGroup();
17789 bool hasLooterGuid = false;
17790
17791 if (group)
17792 {
17793 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17794
17795 if (creature)
17796 {
17797 group->UpdateLooterGuid(creature, true);
17798 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17799 {
17800 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17801 if (looter)
17802 {
17803 hasLooterGuid = true;
17804 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17805 }
17806 }
17807 }
17808 }
17809 else
17810 {
17811 player->SendDirectMessage(&data);
17812
17813 if (creature)
17814 {
17815 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17816 data2 << creature->GetGUID();
17817 data2 << uint8(0); // unk1
17818 data2 << uint8(0); // no group looter
17819 player->SendMessageToSet(&data2, true);
17820 }
17821 }
17822
17823 // Generate loot before updating looter
17824 if (creature)
17825 {
17826 Loot* loot = &creature->loot;
17827 loot->clear();
17828
17829 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17830 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17831
17832 if (creature->GetLootMode())
17834
17835 if (group)
17836 {
17837 if (hasLooterGuid)
17838 group->SendLooter(creature, looter);
17839 else
17840 group->SendLooter(creature, nullptr);
17841
17842 // Update round robin looter only if the creature had loot
17843 if (!creature->loot.empty())
17844 group->UpdateLooterGuid(creature);
17845 }
17846 }
17847
17848 player->RewardPlayerAndGroupAtKill(victim, false);
17849 }
17850
17851 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17852 if (killer && (killer->IsPet() || killer->IsTotem()))
17853 if (Unit* owner = killer->GetOwner())
17854 {
17855 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17856 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17857 }
17858
17859 if (killer != victim)
17860 {
17861 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17862 }
17863
17864 // Proc auras on death - must be before aura/combat remove
17865 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17866
17867 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17868 // and before Spirit of Redemption as it also removes auras
17869 if (killer)
17870 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17871 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17872
17873 // Spirit of Redemption
17874 // if talent known but not triggered (check priest class for speedup check)
17875 bool spiritOfRedemption = false;
17877 {
17878 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17879 {
17880 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17881 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
17882 {
17883 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17884 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17885 victim->GetPositionY(), victim->GetPositionZ());
17886
17887 ACE_Stack_Trace trace(0, 50);
17888 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17889 }
17890 else
17891 {
17892 // save value before aura remove
17893 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17894 if (!ressSpellId)
17895 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17896
17897 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17898 victim->RemoveAllAurasOnDeath();
17899
17900 // Stop attacks
17901 victim->CombatStop();
17903
17904 // restore for use at real death
17905 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17906
17907 // FORM_SPIRITOFREDEMPTION and related auras
17908 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17909 spiritOfRedemption = true;
17910 }
17911 }
17912 }
17913
17914 if (!spiritOfRedemption)
17915 {
17916 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17918 }
17919
17920 // Inform pets (if any) when player kills target)
17921 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17922 // selection will get stuck on same target and break pet react state
17923 if (player)
17924 {
17925 Pet* pet = player->GetPet();
17926 if (pet && pet->IsAlive() && pet->isControlled())
17927 pet->AI()->KilledUnit(victim);
17928 }
17929
17930 // 10% durability loss on death
17931 // clean InHateListOf
17932 if (Player* plrVictim = victim->ToPlayer())
17933 {
17934 // remember victim PvP death for corpse type and corpse reclaim delay
17935 // at original death (not at SpiritOfRedemtionTalent timeout)
17936 plrVictim->SetPvPDeath(player != nullptr);
17937
17938 // only if not player and not controlled by player pet. And not at BG
17939 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
17940 {
17941 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
17942 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
17943 // durability lost message
17944 plrVictim->SendDurabilityLoss();
17945 }
17946 // Call KilledUnit for creatures
17947 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17948 killer->ToCreature()->AI()->KilledUnit(victim);
17949
17950 // last damage from non duel opponent or opponent controlled creature
17951 if (plrVictim->duel)
17952 {
17953 plrVictim->duel->Opponent->CombatStopWithPets(true);
17954 plrVictim->CombatStopWithPets(true);
17955 plrVictim->DuelComplete(DUEL_INTERRUPTED);
17956 }
17957 }
17958 else // creature died
17959 {
17960 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
17961
17962 if (!creature->IsPet() && creature->GetLootMode() > 0)
17963 {
17964 creature->GetThreatMgr().ClearAllThreat();
17965
17966 // must be after setDeathState which resets dynamic flags
17967 if (!creature->loot.isLooted())
17968 {
17970 }
17971 else
17972 {
17973 creature->AllLootRemovedFromCorpse();
17974 }
17975 }
17976
17977 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
17978 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17979 killer->ToCreature()->AI()->KilledUnit(victim);
17980
17981 // Call creature just died function
17982 if (CreatureAI* ai = creature->AI())
17983 {
17984 ai->JustDied(killer);
17985 }
17986
17987 if (TempSummon* summon = creature->ToTempSummon())
17988 {
17989 if (WorldObject* summoner = summon->GetSummoner())
17990 {
17991 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
17992 {
17993 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
17994 }
17995 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
17996 {
17997 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
17998 }
17999 }
18000 }
18001
18002 // Dungeon specific stuff, only applies to players killing creatures
18003 if (creature->GetInstanceId())
18004 {
18005 Map* instanceMap = creature->GetMap();
18006 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18008
18009 if (instanceMap->IsDungeon() && player)
18010 if (instanceMap->IsRaidOrHeroicDungeon())
18012 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18013 }
18014 }
18015
18016 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18017 // handle player kill only if not suicide (spirit of redemption for example)
18018 if (player && killer != victim)
18019 {
18020 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18021 pvp->HandleKill(player, victim);
18022
18023 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18024 bf->HandleKill(player, victim);
18025 }
18026
18027 //if (victim->IsPlayer())
18028 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18029 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18030
18031 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18032 if (player)
18033 if (Battleground* bg = player->GetBattleground())
18034 {
18035 if (victim->IsPlayer())
18036 bg->HandleKillPlayer(victim->ToPlayer(), player);
18037 else
18038 bg->HandleKillUnit(victim->ToCreature(), player);
18039 }
18040
18041 // achievement stuff
18042 if (killer && victim->IsPlayer())
18043 {
18044 if (killer->IsCreature())
18046 else if (victim != killer && killer->IsPlayer())
18048 }
18049
18050 // Hook for OnPVPKill Event
18051 if (killer)
18052 {
18053 if (Player* killerPlr = killer->ToPlayer())
18054 {
18055 if (Player* killedPlr = victim->ToPlayer())
18056 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18057 else if (Creature* killedCre = victim->ToCreature())
18058 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18059 }
18060 else if (Creature* killerCre = killer->ToCreature())
18061 {
18062 if (Player* killed = victim->ToPlayer())
18063 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18064 }
18065 }
18066
18067 sScriptMgr->OnUnitDeath(victim, killer);
18068}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:482
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3371
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3878
@ PROC_FLAG_KILLED
Definition SpellMgr.h:107
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition WorldConfig.h:476
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition WorldConfig.h:25
Definition Battlefield.h:205
Definition CreatureAI.h:71
virtual void KilledUnit(Unit *)
Definition CreatureAI.h:132
Loot loot
Definition Creature.h:229
uint16 GetLootMode() const
Definition Creature.h:243
void AllLootRemovedFromCorpse()
Definition Creature.cpp:3006
bool IsLootRewardDisabled() const
Definition Creature.h:365
Player * GetLootRecipient() const
Definition Creature.cpp:1319
bool IsDamageEnoughForLootingAndReward() const
Definition Creature.cpp:3732
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1326
GroupReference * next()
Definition GroupReference.h:36
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1757
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2394
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2331
LootMethod GetLootMethod() const
Definition Group.cpp:2326
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1868
void SendLooter(Creature *creature, Player *pLooter)
Definition Group.cpp:967
void PermBindAllPlayers()
Definition Map.cpp:2202
Definition Map.h:163
bool IsRaidOrHeroicDungeon() const
Definition Map.h:298
InstanceMap * ToInstanceMap()
Definition Map.h:377
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
Definition OutdoorPvP.h:186
TeamId GetTeamId(bool original=false) const
Definition Player.h:2108
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12246
uint32 GetResurrectionSpellId()
Definition Player.cpp:12662
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12563
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12776
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5417
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5618
uint32 GetInstanceId() const
Definition Object.h:510
uint32 GetZoneId() const
Definition Object.cpp:3063
@ SMSG_PARTYKILLLOG
Definition Opcodes.h:531
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
uint32 mingold
Definition CreatureData.h:231
uint32 maxgold
Definition CreatureData.h:232
uint32 lootid
Definition CreatureData.h:224
Definition LootMgr.h:313
bool empty() const
Definition LootMgr.h:367
bool isLooted() const
Definition LootMgr.h:368
void clear()
Definition LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:838
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), JustDied, CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1201{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), spell_chapter2_persuasive_strike::HandleHit(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_necropolis_health::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19171{
19172 Player* player = ToPlayer();
19173 if (!player)
19174 {
19175 if (Unit* charmer = GetCharmer())
19176 {
19177 player = charmer->ToPlayer();
19178 if (player && player->m_mover != this)
19179 player = nullptr;
19180 }
19181 }
19182
19183 if (!player)
19184 {
19185 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19186 }
19187 else
19188 {
19189 float vcos, vsin;
19190 GetSinCos(x, y, vsin, vcos);
19191
19192 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19193 data << GetPackGUID();
19194 data << player->GetSession()->GetOrderCounter(); // movement counter
19195 data << float(vcos); // x direction
19196 data << float(vsin); // y direction
19197 data << float(speedXY); // Horizontal speed
19198 data << float(-speedZ); // Z Movement speed (vertical)
19199
19200 player->SendDirectMessage(&data);
19201 player->GetSession()->IncrementOrderCounter();
19202
19203 player->SetCanKnockback(true);
19204 }
19205}
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition MotionMaster.cpp:607
SafeUnitPointer m_mover
Definition Player.h:2337
void SetCanKnockback(bool value)
Definition Player.h:2504
WorldSession * GetSession() const
Definition Player.h:1998
uint32 GetOrderCounter() const
Definition WorldSession.h:600
void IncrementOrderCounter()
Definition WorldSession.h:601
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition Position.cpp:99

References GetCharmer(), GetMotionMaster(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), WorldSession::IncrementOrderCounter(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), Player::SendDirectMessage(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3365{
3366 // Can`t miss on dead target (on skinning for example)
3367 if (!victim->IsAlive() && !victim->IsPlayer())
3368 return SPELL_MISS_NONE;
3369
3370 // vehicles cant miss
3371 if (IsVehicle())
3372 return SPELL_MISS_NONE;
3373
3374 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3375 // resist and deflect chances
3376 // xinef: skip all calculations, proof: Toxic Tolerance quest
3377 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3378 return SPELL_MISS_NONE;
3379
3380 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3381 {
3382 return SPELL_MISS_NONE;
3383 }
3384
3385 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3386 int32 thisLevel = getLevelForTarget(victim);
3387 if (IsCreature() && ToCreature()->IsTrigger())
3388 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3389 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3390
3391 int32 MISS_CHANCE_MULTIPLIER;
3392 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3393 {
3394 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3395 }
3396 else
3397 {
3398 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3399 victim->IsPlayer()
3402 }
3403
3404 // Base hit chance from attacker and victim levels
3405 int32 modHitChance = levelDiff < 3
3406 ? 96 - levelDiff
3407 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3408
3409 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3410 if (Player* modOwner = GetSpellModOwner())
3411 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3412
3413 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3415
3416 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3417 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3418 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3419 {
3420 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3422 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3423 if (spellInfo->IsAffectingArea())
3424 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3425
3426 // Decrease hit chance from victim rating bonus
3427 if (victim->IsPlayer())
3428 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3429 }
3430
3431 int32 HitChance = modHitChance * 100;
3432 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3433 // Xinef: Totems should inherit casters ratings?
3434 if (IsTotem())
3435 {
3436 if (Unit* owner = GetOwner())
3437 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3438 }
3439 else
3440 HitChance += int32(m_modSpellHitChance * 100.0f);
3441
3442 if (HitChance < 100)
3443 HitChance = 100;
3444 else if (HitChance > 10000)
3445 HitChance = 10000;
3446
3447 int32 tmp = 10000 - HitChance;
3448
3449 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3450
3451 if (rand < tmp)
3452 return SPELL_MISS_MISS;
3453
3454 // Chance resist mechanic (select max value from every mechanic spell effect)
3455 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3456 tmp += resist_chance;
3457
3458 // Chance resist debuff
3459 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3460 {
3461 bool bNegativeAura = true;
3462 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3463 {
3464 // Xinef: Check if effect exists!
3465 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3466 {
3467 bNegativeAura = false;
3468 break;
3469 }
3470 }
3471
3472 if (bNegativeAura)
3473 {
3474 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3475 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3476 }
3477
3478 // Players resistance for binary spells
3479 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3480 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3481 }
3482
3483 // Roll chance
3484 if (rand < tmp)
3485 return SPELL_MISS_RESIST;
3486
3487 // cast by caster in front of victim
3488 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3489 {
3490 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3491 tmp += deflect_chance;
3492 if (rand < tmp)
3493 return SPELL_MISS_DEFLECT;
3494 }
3495
3496 return SPELL_MISS_NONE;
3497}
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition SharedDefines.h:677
@ SPELL_MISS_NONE
Definition SharedDefines.h:1530
@ SPELL_MISS_RESIST
Definition SharedDefines.h:1532
@ SPELL_MISS_MISS
Definition SharedDefines.h:1531
@ SPELL_MISS_DEFLECT
Definition SharedDefines.h:1539
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition SpellDefines.h:92
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:232
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition WorldConfig.h:131
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition WorldConfig.h:484
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition WorldConfig.h:483
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5217
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6151
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6137
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition Unit.cpp:3170

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13150{
13151 if (!victim || pdamage == 0)
13152 return 0;
13153
13154 if (IsCreature())
13155 {
13156 // Dancing Rune Weapon...
13157 if (GetEntry() == 27893)
13158 {
13159 if (Unit* owner = GetOwner())
13160 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13161 }
13162 }
13163
13164 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13165
13166 // Done fixed damage bonus auras
13167 int32 DoneFlatBenefit = 0;
13168
13169 // ..done
13171 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13172 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13173 DoneFlatBenefit += (*i)->GetAmount();
13174
13175 // ..done
13176 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13177
13178 // ..done (base at attack power for marked target and base at attack power for creature type)
13179 int32 APbonus = 0;
13180
13181 if (attType == RANGED_ATTACK)
13182 {
13183 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13184
13185 // ..done (base at attack power and creature type)
13187 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13188 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13189 APbonus += (*i)->GetAmount();
13190 }
13191 else
13192 {
13193 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13194
13195 // ..done (base at attack power and creature type)
13197 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13198 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13199 APbonus += (*i)->GetAmount();
13200 }
13201
13202 if (APbonus != 0) // Can be negative
13203 {
13204 bool normalized = false;
13205 if (spellProto)
13206 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13207 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13208 {
13209 normalized = true;
13210 break;
13211 }
13212 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13213 }
13214
13215 // Done total percent damage auras
13216 float DoneTotalMod = 1.0f;
13217
13218 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13219 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13220 {
13221 // Some spells don't benefit from pct done mods
13223 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13224 {
13225 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13226 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13227 {
13228 if (((*i)->GetMiscValue() & damageSchoolMask))
13229 {
13230 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13231 AddPct(DoneTotalMod, (*i)->GetAmount());
13232 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13233 AddPct(DoneTotalMod, (*i)->GetAmount());
13234 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13235 AddPct(DoneTotalMod, (*i)->GetAmount());
13236 }
13237 }
13238 }
13239 }
13240
13242 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13243 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13244 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13245 AddPct(DoneTotalMod, (*i)->GetAmount());
13246
13247 // bonus against aurastate
13249 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13250 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13251 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13252 AddPct(DoneTotalMod, (*i)->GetAmount());
13253
13254 // done scripted mod (take it from owner)
13255 Unit* owner = GetOwner() ? GetOwner() : this;
13256 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13257 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13258 {
13259 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13260 continue;
13261
13262 if (!(*i)->IsAffectedOnSpell(spellProto))
13263 continue;
13264
13265 switch ((*i)->GetMiscValue())
13266 {
13267 // Tundra Stalker
13268 // Merciless Combat
13269 case 7277:
13270 {
13271 // Merciless Combat
13272 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13273 {
13274 if (!victim->HealthAbovePct(35))
13275 AddPct(DoneTotalMod, (*i)->GetAmount());
13276 }
13277 // Tundra Stalker
13278 else
13279 {
13280 // Frost Fever (target debuff)
13281 if (victim->HasAura(55095))
13282 AddPct(DoneTotalMod, (*i)->GetAmount());
13283 }
13284 break;
13285 }
13286 // Rage of Rivendare
13287 case 7293:
13288 {
13289 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13290 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13291 break;
13292 }
13293 // Marked for Death
13294 case 7598:
13295 case 7599:
13296 case 7600:
13297 case 7601:
13298 case 7602:
13299 {
13300 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13301 AddPct(DoneTotalMod, (*i)->GetAmount());
13302 break;
13303 }
13304 // Dirty Deeds
13305 case 6427:
13306 case 6428:
13307 {
13308 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13309 {
13310 // effect 0 has expected value but in negative state
13311 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13312 AddPct(DoneTotalMod, bonus);
13313 }
13314 break;
13315 }
13316 }
13317 }
13318
13319 // Custom scripted damage
13320 if (spellProto)
13321 switch (spellProto->SpellFamilyName)
13322 {
13324 // Glacier Rot
13325 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13327 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13328 AddPct(DoneTotalMod, aurEff->GetAmount());
13329 break;
13330 }
13331
13332 // Some spells don't benefit from done mods
13333 if (spellProto)
13334 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13335 {
13336 DoneFlatBenefit = 0;
13337 DoneTotalMod = 1.0f;
13338 }
13339
13340 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13341
13342 // apply spellmod to Done damage
13343 if (spellProto)
13344 if (Player* modOwner = GetSpellModOwner())
13345 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13346
13347 // bonus result can be negative
13348 return uint32(std::max(tmpDamage, 0.0f));
13349}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition SharedDefines.h:910
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition SharedDefines.h:594
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition SharedDefines.h:533
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17240
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.h:1400

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13352{
13353 if (pdamage == 0)
13354 return 0;
13355
13356 int32 TakenFlatBenefit = 0;
13357
13358 // ..taken
13360 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13361 if ((*i)->GetMiscValue() & damageSchoolMask)
13362 TakenFlatBenefit += (*i)->GetAmount();
13363
13364 if (attType != RANGED_ATTACK)
13366 else
13368
13369 // Taken total percent damage auras
13370 float TakenTotalMod = 1.0f;
13371
13373
13374 // .. taken pct (special attacks)
13375 if (spellProto)
13376 {
13377 // From caster spells
13379 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13380 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13381 AddPct(TakenTotalMod, (*i)->GetAmount());
13382
13383 // Mod damage from spell mechanic
13384 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13385
13386 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13387 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13388 mechanicMask |= (1 << MECHANIC_BLEED);
13389
13390 if (mechanicMask)
13391 {
13393 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13394 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13395 AddPct(TakenTotalMod, (*i)->GetAmount());
13396 }
13397 }
13398
13399 TakenTotalMod = processDummyAuras(TakenTotalMod);
13400
13401 // .. taken pct: class scripts
13402 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13403 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13404 {
13405 switch ((*i)->GetMiscValue())
13406 {
13407 }
13408 }*/
13409
13410 if (attType != RANGED_ATTACK)
13411 {
13413 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13414 AddPct(TakenTotalMod, (*i)->GetAmount());
13415 }
13416 else
13417 {
13418 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13419 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13420 AddPct(TakenTotalMod, (*i)->GetAmount());
13421 }
13422
13423 // No positive taken bonus, custom attr
13424 if (spellProto)
13425 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13426 {
13427 TakenFlatBenefit = 0;
13428 TakenTotalMod = 1.0f;
13429 }
13430
13431 // xinef: sanctified wrath talent
13432 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13433 {
13434 float ignoreModifier = 1.0f - TakenTotalMod;
13435 bool addModifier = false;
13437 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13438 if ((*j)->GetMiscValue() & damageSchoolMask)
13439 {
13440 ApplyPct(ignoreModifier, (*j)->GetAmount());
13441 addModifier = true;
13442 }
13443
13444 if (addModifier)
13445 TakenTotalMod += ignoreModifier;
13446 }
13447
13448 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13449
13450 // bonus result can be negative
13451 return uint32(std::max(tmpDamage, 0.0f));
13452}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition Unit.cpp:11975
bool HasIgnoreTargetResistAura() const
Definition Unit.h:1783

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3192{
3193 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3194 // resist and deflect chances
3195 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3196 return SPELL_MISS_NONE;
3197
3198 WeaponAttackType attType = BASE_ATTACK;
3199
3200 // Check damage class instead of attack type to correctly handle judgements
3201 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3202 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3203 attType = RANGED_ATTACK;
3204
3205 int32 attackerWeaponSkill;
3206 // skill value for these spells (for example judgements) is 5* level
3207 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3208 attackerWeaponSkill = GetLevel() * 5;
3209 // bonus from skills is 0.04% per skill Diff
3210 else
3211 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3212
3213 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3214
3215 uint32 roll = urand (0, 10000);
3216
3217 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3218 // Roll miss
3219 uint32 tmp = missChance;
3220 if (roll < tmp)
3221 return SPELL_MISS_MISS;
3222
3223 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3224 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3225 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3226
3227 // Same spells cannot be parry/dodge
3228 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3229 return SPELL_MISS_NONE;
3230
3231 // Chance resist mechanic
3232 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3233 tmp += resist_chance;
3234 if (roll < tmp)
3235 return SPELL_MISS_RESIST;
3236
3237 // Ranged attacks can only miss, resist and deflect
3238 if (attType == RANGED_ATTACK)
3239 {
3240 // only if in front
3241 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3242 {
3243 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3244 tmp += deflect_chance;
3245 if (roll < tmp)
3246 return SPELL_MISS_DEFLECT;
3247 }
3248
3249 canDodge = false;
3250 canParry = false;
3251 }
3252
3253 // Check for attack from behind
3254 // xinef: if from behind or spell requires cast from behind
3255 if (!victim->HasInArc(M_PI, this))
3256 {
3257 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3258 {
3259 // Can`t dodge from behind in PvP (but its possible in PvE)
3260 if (victim->IsPlayer())
3261 {
3262 canDodge = false;
3263 }
3264
3265 // Can`t parry or block
3266 canParry = false;
3267 canBlock = false;
3268 }
3269 }
3270
3271 // Check creatures flags_extra for disable parry
3272 if (victim->IsCreature())
3273 {
3274 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3275 // Xinef: no dodge flag
3276 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3277 canDodge = false;
3278 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3279 canParry = false;
3280 // Check creatures flags_extra for disable block
3281 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3282 canBlock = false;
3283 }
3284 // Ignore combat result aura
3286 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3287 {
3288 if (!(*i)->IsAffectedOnSpell(spellInfo))
3289 continue;
3290 switch ((*i)->GetMiscValue())
3291 {
3292 case MELEE_HIT_DODGE:
3293 canDodge = false;
3294 break;
3295 case MELEE_HIT_BLOCK:
3296 canBlock = false;
3297 break;
3298 case MELEE_HIT_PARRY:
3299 canParry = false;
3300 break;
3301 default:
3302 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3303 break;
3304 }
3305 }
3306
3307 if (canDodge)
3308 {
3309 // Roll dodge
3310 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3311 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3313 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3314 // Reduce dodge chance by attacker expertise rating
3315 if (IsPlayer())
3316 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3317 else
3319
3320 // xinef: cant dodge while casting or while stunned
3321 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3322 dodgeChance = 0;
3323
3324 tmp += dodgeChance;
3325 if (roll < tmp)
3326 return SPELL_MISS_DODGE;
3327 }
3328
3329 if (canParry)
3330 {
3331 // Roll parry
3332 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3333 // Reduce parry chance by attacker expertise rating
3334 if (IsPlayer())
3335 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3336 else
3338
3339 // xinef: cant parry while casting or while stunned
3340 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3341 parryChance = 0;
3342
3343 tmp += parryChance;
3344 if (roll < tmp)
3345 return SPELL_MISS_PARRY;
3346 }
3347
3348 if (canBlock)
3349 {
3350 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3351
3352 // xinef: cant block while casting or while stunned
3353 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3354 blockChance = 0;
3355
3356 tmp += blockChance;
3357 if (roll < tmp)
3358 return SPELL_MISS_BLOCK;
3359 }
3360
3361 return SPELL_MISS_NONE;
3362}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition CreatureData.h:68
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition SharedDefines.h:676
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition SharedDefines.h:675
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition SharedDefines.h:507
@ SPELL_MISS_PARRY
Definition SharedDefines.h:1534
@ SPELL_MISS_DODGE
Definition SharedDefines.h:1533
@ SPELL_MISS_BLOCK
Definition SharedDefines.h:1535
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition SpellInfo.h:193
float GetUnitDodgeChance() const
Definition Unit.cpp:3677
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:6023
float GetUnitParryChance() const
Definition Unit.cpp:3694
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition Unit.cpp:19015
uint32 flags_extra
Definition CreatureData.h:246

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19016{
19017 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19018 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19019 {
19020 return 0.0f;
19021 }
19022
19023 //calculate miss chance
19024 float missChance = victim->GetUnitMissChance(attType);
19025
19026 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19027 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19028 {
19029 missChance += 19;
19030 }
19031
19032 // bonus from skills is 0.04%
19033 //miss_chance -= skillDiff * 0.04f;
19034 int32 diff = -skillDiff;
19035 if (victim->IsPlayer())
19036 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19037 else
19038 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19039
19040 // Calculate hit chance
19041 float hitChance = 100.0f;
19042
19043 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19044 if (spellId)
19045 {
19046 if (Player* modOwner = GetSpellModOwner())
19047 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19048 }
19049
19050 missChance -= hitChance - 100.0f;
19051
19052 if (attType == RANGED_ATTACK)
19053 missChance -= m_modRangedHitChance;
19054 else
19055 missChance -= m_modMeleeHitChance;
19056
19057 // Limit miss chance from 0 to 60%
19058 if (missChance < 0.0f)
19059 return 0.0f;
19060 if (missChance > 60.0f)
19061 return 60.0f;
19062 return missChance;
19063}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10574{
10575 if (apply)
10576 {
10577 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10578 {
10579 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10580 Unit::AuraMap& tAuras = GetOwnedAuras();
10581 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10582 {
10583 if ((*itr).second->IsRemoved())
10584 continue;
10585
10586 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10587 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10588 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10589 }
10590 }
10591 }
10592 else
10593 {
10594 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10595 {
10596 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10597
10598 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10599 {
10600 Unit::AuraMap& tAuras = GetOwnedAuras();
10601 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10602 {
10603 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10604 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10605 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10606 }
10607 }
10608 }
10609 }
10610}
@ AURA_STATE_ENRAGE
Definition SharedDefines.h:1320
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:834
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:849
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:655
AuraMap & GetOwnedAuras()
Definition Unit.h:1336

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14176{
14177 int32 gain = 0;
14178
14179 if (dVal == 0)
14180 return 0;
14181
14182 int32 curHealth = (int32)GetHealth();
14183
14184 int32 val = dVal + curHealth;
14185 if (val <= 0)
14186 {
14187 SetHealth(0);
14188 return -curHealth;
14189 }
14190
14191 int32 maxHealth = (int32)GetMaxHealth();
14192
14193 if (val < maxHealth)
14194 {
14195 SetHealth(val);
14196 gain = val - curHealth;
14197 }
14198 else if (curHealth != maxHealth)
14199 {
14200 SetHealth(maxHealth);
14201 gain = maxHealth - curHealth;
14202 }
14203
14204 return gain;
14205}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14234{
14235 if (dVal == 0)
14236 return 0;
14237
14238 int32 gain = 0;
14239
14240 int32 curPower = (int32)GetPower(power);
14241
14242 int32 val = dVal + curPower;
14243 if (val <= 0)
14244 {
14245 SetPower(power, 0, withPowerUpdate);
14246 return -curPower;
14247 }
14248
14249 int32 maxPower = (int32)GetMaxPower(power);
14250
14251 if (val < maxPower)
14252 {
14253 SetPower(power, val, withPowerUpdate);
14254 gain = val - curPower;
14255 }
14256 else if (curPower != maxPower)
14257 {
14258 SetPower(power, maxPower, withPowerUpdate);
14259 gain = maxPower - curPower;
14260 }
14261
14262 if (GetAI())
14263 {
14264 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14265 }
14266
14267 return gain;
14268}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition UnitAI.h:374
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15591

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14272{
14273 float amount = (float)GetMaxPower(power);
14274 ApplyPercentModFloatVar(amount, pct, apply);
14275
14276 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14277}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition ThreatMgr.h:307

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
14999{
15000 if (!spellInfo || castTime < 0)
15001 return;
15002
15003 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15004 return;
15005
15006 // called from caster
15007 if (Player* modOwner = GetSpellModOwner())
15009 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15010
15011 switch (spellInfo->DmgClass)
15012 {
15014 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15015 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15016 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15017 castTime = 500;
15018 break;
15020 break; // no known cases
15022 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15023 break;
15025 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15026 break;
15027 default:
15028 break;
15029 }
15030}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition SharedDefines.h:591
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
bool CanInstantCast() const
Definition Unit.h:1546

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14899{
14900 // don't mod permanent auras duration
14901 if (duration < 0)
14902 return duration;
14903
14904 // some auras are not affected by duration modifiers
14905 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14906 return duration;
14907
14908 // cut duration only of negative effects
14909 // xinef: also calculate self casts, spell can be reflected for example
14910 if (!positive)
14911 {
14912 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14913
14914 int32 durationMod;
14915 int32 durationMod_always = 0;
14916 int32 durationMod_not_stack = 0;
14917
14918 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14919 {
14920 if (!(mechanic & 1 << i))
14921 continue;
14922
14923 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14924 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14925 continue;
14926
14927 // Find total mod value (negative bonus)
14928 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14929 // Find max mod (negative bonus)
14930 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14931 // Check if mods applied before were weaker
14932 if (new_durationMod_always < durationMod_always)
14933 durationMod_always = new_durationMod_always;
14934 if (new_durationMod_not_stack < durationMod_not_stack)
14935 durationMod_not_stack = new_durationMod_not_stack;
14936 }
14937
14938 // Select strongest negative mod
14939 if (durationMod_always > durationMod_not_stack)
14940 durationMod = durationMod_not_stack;
14941 else
14942 durationMod = durationMod_always;
14943
14944 if (durationMod != 0)
14945 AddPct(duration, durationMod);
14946
14947 // there are only negative mods currently
14948 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
14949 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
14950
14951 durationMod = 0;
14952 if (durationMod_always > durationMod_not_stack)
14953 durationMod += durationMod_not_stack;
14954 else
14955 durationMod += durationMod_always;
14956
14957 if (durationMod != 0)
14958 AddPct(duration, durationMod);
14959 }
14960 else
14961 {
14962 // else positive mods here, there are no currently
14963 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
14964 }
14965
14966 // Glyphs which increase duration of selfcasted buffs
14967 if (target == this)
14968 {
14969 switch (spellProto->SpellFamilyName)
14970 {
14971 case SPELLFAMILY_DRUID:
14972 if (spellProto->SpellFamilyFlags[0] & 0x100)
14973 {
14974 // Glyph of Thorns
14975 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
14976 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14977 }
14978 break;
14980 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
14981 {
14982 // Glyph of Blessing of Might
14983 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
14984 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14985 }
14986 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
14987 {
14988 // Glyph of Blessing of Wisdom
14989 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
14990 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
14991 }
14992 break;
14993 }
14994 }
14995 return std::max(duration, 0);
14996}
constexpr auto MINUTE
Definition Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition SharedDefines.h:653
@ MECHANIC_ENRAGED
Definition SharedDefines.h:1367
@ MECHANIC_DISORIENTED
Definition SharedDefines.h:1338
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition SpellAuraDefines.h:295

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

void Unit::MonsterMoveWithSpeed ( float  x,
float  y,
float  z,
float  speed 
)
531{
532 Movement::MoveSplineInit init(this);
533 init.MoveTo(x, y, z);
534 init.SetVelocity(speed);
535 init.Launch();
536}

References Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetVelocity().

Referenced by CinematicMgr::UpdateCinematicLocation().

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13541{
13542 if (mount)
13544
13546
13547 if (Player* player = ToPlayer())
13548 {
13549 sScriptMgr->AnticheatSetUnderACKmount(player);
13550
13551 // mount as a vehicle
13552 if (VehicleId)
13553 {
13554 if (CreateVehicleKit(VehicleId, creatureEntry))
13555 {
13556 GetVehicleKit()->Reset();
13557
13558 // Send others that we now have a vehicle
13560 data << GetPackGUID();
13561 data << uint32(VehicleId);
13562 SendMessageToSet(&data, true);
13563
13565 player->SendDirectMessage(&data);
13566
13567 // mounts can also have accessories
13569 }
13570 }
13571
13572 // unsummon pet
13573 Pet* pet = player->GetPet();
13574 if (pet)
13575 {
13577 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13578 if (bg && bg->isArena())
13580 else
13581 player->UnsummonPetTemporaryIfAny();
13582 }
13583
13584 // xinef: if we have charmed npc, stun him also
13585 if (Unit* charm = player->GetCharm())
13586 if (charm->IsCreature())
13587 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13588
13589 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13590 data << GetPackGUID();
13591 data << player->GetSession()->GetOrderCounter(); // movement counter
13592 data << player->GetCollisionHeight();
13593 player->SendDirectMessage(&data);
13594 player->GetSession()->IncrementOrderCounter();
13595 }
13596
13598}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition SpellDefines.h:60
bool isArena() const
Definition Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:18742
void Reset(bool evading=false)
Definition Vehicle.cpp:120
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:87

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), and WorldSession::SendDoFlight().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19746{
19747 DisableSpline();
19748 if (IsPlayer())
19749 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19750 else
19751 {
19752 Position pos = {x, y, z, orientation};
19753 SendTeleportPacket(pos);
19754 UpdatePosition(x, y, z, orientation, true);
19757 }
19758}
@ TELE_TO_WITH_PET
Definition Player.h:822
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:821
@ TELE_TO_SPELL
Definition Player.h:820
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:818
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:819
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:817
void ReinitializeMovement()
Definition MotionMaster.cpp:940
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1350
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:19767
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19157
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:19786

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19741{
19742 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19743}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:19740

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
19996{
19997 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
19998 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
19999 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20001 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20002 if (IsInWorld())
20003 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20004
20005 LOG_INFO("entities.unit", "Summon Slot: ");
20006 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20007 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20008 LOG_INFO("server.loading", " ");
20009
20010 LOG_INFO("entities.unit", "Controlled List: ");
20011 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20012 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20013 LOG_INFO("server.loading", " ");
20014
20015 LOG_INFO("entities.unit", "Aura List: ");
20016 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20017 LOG_INFO("entities.unit", "{}, ", itr->first);
20018 LOG_INFO("server.loading", " ");
20019
20020 if (IsVehicle())
20021 {
20022 LOG_INFO("entities.unit", "Passenger List: ");
20023 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20024 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20025 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20026 LOG_INFO("server.loading", " ");
20027 }
20028
20029 if (GetVehicle())
20030 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20031}
Seats
Definition boss_flame_leviathan.cpp:168
SeatMap Seats
Definition Vehicle.h:56

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, Vehicle::Seats, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20722{
20723 Creature const* creature = ToCreature();
20724
20725 // UNIT_NPC_FLAGS
20726 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20727 {
20728 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20729
20730 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20731 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20732
20733 if (!target->CanSeeSpellClickOn(creature))
20734 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20735
20736 if (!target->CanSeeVendor(creature))
20737 {
20738 appendValue &= ~UNIT_NPC_FLAG_REPAIR;
20739 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20740 }
20741
20742 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20743 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20744
20745 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20746 }
20747
20748 // UNIT_FIELD_AURASTATE
20749 if (posPointers.UnitFieldAuraStatePos >= 0)
20750 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20751
20752 // UNIT_FIELD_FLAGS
20753 if (posPointers.UnitFieldFlagsPos >= 0)
20754 {
20755 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20756 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20757 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20758
20759 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20760 }
20761
20762 // UNIT_FIELD_DISPLAYID
20763 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20764 if (posPointers.UnitFieldDisplayPos >= 0)
20765 {
20767 if (creature)
20768 {
20769 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20770
20771 // this also applies for transform auras
20772 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20773 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20774 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20775 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20776 {
20777 cinfo = transformInfo;
20778 break;
20779 }
20780
20782 {
20783 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20784 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20785 else
20786 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20787 }
20788 }
20789
20790 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20791 }
20792
20793 // UNIT_DYNAMIC_FLAGS
20794 // Hide lootable animation for unallowed players.
20795 if (posPointers.UnitDynamicFlagsPos >= 0)
20796 {
20798
20799 if (creature)
20800 {
20801 if (creature->hasLootRecipient())
20802 {
20803 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20804 if (creature->isTappedBy(target))
20805 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20806 }
20807
20808 if (!target->isAllowedToLoot(creature))
20809 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20810 }
20811
20812 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20813 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20815 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20816
20817 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20818 }
20819
20820 // UNIT_FIELD_BYTES_2
20821 if (posPointers.UnitFieldBytes2Pos >= 0)
20822 {
20823 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20824 {
20826 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20827 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20828 // Allow targetting opposite faction in party when enabled in config
20829 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20830 }// pussywizard / Callmephil
20831 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20832 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20833 {
20834 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20835 }
20836 }
20837
20838 // UNIT_FIELD_FACTIONTEMPLATE
20839 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20840 {
20841 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20842 {
20844 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20845 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20846 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20847 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20848 }// pussywizard / Callmephil
20849 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20850 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20851 {
20852 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20853 }
20854 else if (target->IsGMSpectator() && IsControlledByPlayer())
20855 {
20856 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20857 }
20858 }
20859
20860 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20861}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52
@ UNIT_DYNFLAG_TRACK_UNIT
Definition SharedDefines.h:3372
@ CONFIG_INSTANT_TAXI
Definition WorldConfig.h:340
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition Creature.cpp:1278
bool isTappedBy(Player const *player) const
Definition Creature.cpp:1394
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5621
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14418
bool IsGMSpectator() const
Definition Player.h:1165
bool IsSpectator() const
Definition Player.h:2576
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14328
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition Unit.cpp:10612
bool IsGMAccount() const
Definition WorldSession.cpp:206
int32 UnitFieldFlagsPos
Definition UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition UnitUtils.h:97
uint32 CreatureDisplayID
Definition CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition Creature.cpp:172

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), Player::IsGMSpectator(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16676{
16677 if (slot >= MAX_MOTION_SLOT)
16678 return;
16679
16680 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16681 movementGenerator->Pause(timer);
16682
16683 StopMoving();
16684}
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
Definition MovementGenerator.h:28
void StopMoving()
Definition Unit.cpp:16656

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), boss_shade_of_aran::SetGUID(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20106{
20107 CharmInfo* charmInfo = GetCharmInfo();
20108 if (!charmInfo || !IsCreature())
20109 return;
20110
20111 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20112 {
20113 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20114 if (Unit* owner = GetOwner())
20115 {
20116 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20117 {
20118 AttackStop();
20119 charmInfo->SetIsAtStay(false);
20120 charmInfo->SetIsCommandAttack(true);
20121 charmInfo->SetIsReturning(false);
20122 charmInfo->SetIsFollowing(false);
20123
20124 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20125 }
20126 else if (owner->IsValidAttackTarget(target))
20127 {
20128 AttackStop();
20129 charmInfo->SetIsAtStay(false);
20130 charmInfo->SetIsCommandAttack(true);
20131 charmInfo->SetIsReturning(false);
20132 charmInfo->SetIsFollowing(false);
20133
20134 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20135 ToCreature()->AI()->AttackStart(target);
20136 else
20137 GetMotionMaster()->MoveChase(target);
20138 }
20139 }
20140
20141 // can be extended in future
20142 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20143 {
20144 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20145 charmInfo->SetForcedTargetGUID(target->GetGUID());
20146 }
20147 else
20148 {
20149 charmInfo->SetForcedSpell(0);
20151 }
20152 }
20153}
#define sDisableMgr
Definition DisableMgr.h:88
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ SPELL_FAILED_OUT_OF_RANGE
Definition SharedDefines.h:1057
@ SPELL_FAILED_LINE_OF_SIGHT
Definition SharedDefines.h:1007
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:314
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:446
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition CharmInfo.cpp:303

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6478{
6479 // Not much to do if no flags are set.
6480 if (procAttacker && actor)
6481 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6482 // Now go on with a victim's events'n'auras
6483 // Not much to do if no flags are set or there is no victim
6484 if (victim && victim->IsAlive() && procVictim)
6485 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6486}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16066{
16067 // Player is loaded now - do not allow passive spell casts to proc
16068 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16069 return;
16070 // For melee/ranged based attack need update skills and set some Aura states if victim present
16071 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16072 {
16073 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16074 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16075 return;
16076
16077 // Update skills here for players
16078 // only when you are not fighting other players or their pets/totems (pvp)
16079 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16080 {
16081 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16083 {
16084 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16085 }
16086 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16087 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16088 {
16089 ToPlayer()->UpdateCombatSkills(target, attType, true);
16090 }
16091 }
16092 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16094 {
16095 // for victim
16096 if (isVictim)
16097 {
16098 // if victim and dodge attack
16099 if (procExtra & PROC_EX_DODGE)
16100 {
16101 // Update AURA_STATE on dodge
16102 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16103 {
16106 }
16107 }
16108 // if victim and parry attack
16109 if (procExtra & PROC_EX_PARRY)
16110 {
16111 // For Hunters only Counterattack (skip Mongoose bite)
16113 {
16116 }
16117 else
16118 {
16121 }
16122 }
16123 // if and victim block attack
16124 if (procExtra & PROC_EX_BLOCK)
16125 {
16128 }
16129 }
16130 else // For attacker
16131 {
16132 // Overpower on victim dodge
16133 if (procExtra & PROC_EX_DODGE)
16134 {
16136 {
16137 AddComboPoints(target, 1);
16139 }
16140 }
16141
16142 // Wolverine Bite
16143 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16144 {
16145 AddComboPoints(target, 1);
16147 }
16148 }
16149 }
16150 }
16151
16152 Unit* actor = isVictim ? target : this;
16153 Unit* actionTarget = !isVictim ? target : this;
16154
16155 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16156
16157 ProcTriggeredList procTriggered;
16158 // Fill procTriggered list
16159 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16160 {
16161 // Do not allow auras to proc from effect triggered by itself
16162 if (procAura && procAura->Id == itr->first)
16163 continue;
16164
16165 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16166 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16167 continue;
16168
16169 ProcTriggeredData triggerData(itr->second->GetBase());
16170 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16171 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16172 if (isVictim)
16173 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16174
16175 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16176
16177 // only auras that have trigger spell should proc from fully absorbed damage
16178 if (procExtra & PROC_EX_ABSORB && isVictim)
16179 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16180 active = true;
16181
16182 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16183 // only player spells are taken into account
16184 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16185 active = true;
16186
16187 // AuraScript Hook
16188 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16189 {
16190 continue;
16191 }
16192
16193 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16194
16195 // AuraScript Hook
16196 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16197 {
16198 continue;
16199 }
16200
16201 // do checks using conditions table
16202 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16203 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16204 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16205 {
16206 continue;
16207 }
16208
16209 bool hasTriggeredProc = false;
16210 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16211 {
16212 if (itr->second->HasEffect(i))
16213 {
16214 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16215
16216 // Skip this auras
16217 if (isNonTriggerAura[aurEff->GetAuraType()])
16218 continue;
16219
16220 // If not trigger by default and spellProcEvent == nullptr - skip
16221 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16222 continue;
16223
16224 switch (aurEff->GetAuraType())
16225 {
16228 case SPELL_AURA_DUMMY:
16230 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16231 {
16232 triggerData.triggerSpelId[i] = triggerSpellId;
16233 hasTriggeredProc = true;
16234 }
16235 break;
16236 default:
16237 break;
16238 }
16239
16240 // Some spells must always trigger
16241 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16242 triggerData.effMask |= 1 << i;
16243 }
16244 }
16245
16246 if (triggerData.effMask)
16247 {
16248 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16249 if (hasTriggeredProc)
16250 {
16251 bool proccessed = false;
16252 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16253 {
16254 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16255 {
16256 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16257 if (iter != procTriggered.end())
16258 {
16259 std::advance(iter, 1);
16260 procTriggered.insert(iter, triggerData);
16261 proccessed = true;
16262 break;
16263 }
16264 }
16265 }
16266
16267 if (!proccessed)
16268 {
16269 procTriggered.push_front(triggerData);
16270 }
16271 }
16272 else
16273 {
16274 procTriggered.push_front(triggerData);
16275 }
16276 }
16277 }
16278
16279 // Nothing found
16280 if (procTriggered.empty())
16281 return;
16282
16283 // Note: must SetCantProc(false) before return
16285 SetCantProc(true);
16286
16287 // Handle effects proceed this time
16288 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16289 {
16290 // look for aura in auras list, it may be removed while proc event processing
16291 if (i->aura->IsRemoved())
16292 continue;
16293
16294 bool useCharges = i->aura->IsUsingCharges();
16295 // no more charges to use, prevent proc
16296 if (useCharges && !i->aura->GetCharges())
16297 continue;
16298
16299 bool takeCharges = false;
16300 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16301
16302 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16303
16304 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16305
16306 // For players set spell cooldown if need
16307 uint32 cooldown = 0;
16308 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16309 cooldown = i->spellProcEvent->cooldown;
16310
16311 // Xinef: set cooldown for actual proc
16312 eventInfo.SetProcCooldown(cooldown);
16313
16314 // Note: must SetCantProc(false) before return
16316 SetCantProc(true);
16317
16318 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16319
16320 // "handled" is needed as long as proc can be handled in multiple places
16321 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16322 {
16323 uint32 Id = i->aura->GetId();
16324 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16325 takeCharges = true;
16326 }
16327
16328 if (!handled)
16329 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16330 {
16331 if (!(i->effMask & (1 << effIndex)))
16332 continue;
16333
16334 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16335 ASSERT(triggeredByAura);
16336
16337 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16338 if (prevented)
16339 {
16340 takeCharges = true;
16341 continue;
16342 }
16343
16344 switch (triggeredByAura->GetAuraType())
16345 {
16347 {
16348 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16349 // Don`t drop charge or add cooldown for not started trigger
16350 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16351 takeCharges = true;
16352 break;
16353 }
16355 {
16356 // target has to be valid
16357 if (!eventInfo.GetProcTarget())
16358 break;
16359
16360 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16361 takeCharges = true;
16362 break;
16363 }
16365 case SPELL_AURA_DUMMY:
16366 {
16367 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16368 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16369 takeCharges = true;
16370 break;
16371 }
16376 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16377 takeCharges = true;
16378 break;
16380 {
16381 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16382 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16383 takeCharges = true;
16384 break;
16385 }
16387 {
16388 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16389 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16390 if (damage > 0)
16391 {
16393 takeCharges = true;
16394 }
16395 break;
16396 }
16398 {
16399 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16400 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16401 HandleAuraRaidProcFromCharge(triggeredByAura);
16402 takeCharges = true;
16403 break;
16404 }
16406 {
16407 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16408
16409 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16410 takeCharges = true;
16411 break;
16412 }
16414 // Skip melee hits or instant cast spells
16415 // xinef: check channeled spells which are affected by haste also
16416 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16417 (procSpellInfo->CalcCastTime() > 0 /*||
16418 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16419 takeCharges = true;
16420 break;
16422 // Skip Melee hits and spells ws wrong school
16423 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16424 takeCharges = true;
16425 break;
16427 // Skip Melee hits and targets with magnet aura
16428 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16429 takeCharges = true;
16430 break;
16433 // Skip melee hits and spells ws wrong school or zero cost
16434 if (procSpellInfo &&
16435 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16436 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16437 takeCharges = true;
16438 break;
16441 // Compare mechanic
16442 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16443 takeCharges = true;
16444 break;
16446 // Compare casters
16447 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16448 takeCharges = true;
16449 break;
16450 // CC Auras which use their amount amount to drop
16451 // Are there any more auras which need this?
16457 {
16458 // Spell own direct damage at apply wont break the CC
16459 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16460 if (procSpellInfo)
16461 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16462 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16463 break;
16464
16465 // chargeable mods are breaking on hit
16466 if (useCharges)
16467 takeCharges = true;
16468 else if (triggeredByAura->GetAmount()) // aura must have amount
16469 {
16470 int32 damageLeft = triggeredByAura->GetAmount();
16471 // No damage left
16472 if (damageLeft < int32(damage))
16473 i->aura->Remove();
16474 else
16475 triggeredByAura->SetAmount(damageLeft - damage);
16476 }
16477 break;
16478 }
16480 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16481 break;
16482 takeCharges = true;
16483 break;
16486 {
16487 if (triggeredByAura->GetSpellModifier())
16488 {
16489 // Do proc if mod is consumed by spell
16490 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16491 {
16492 takeCharges = true;
16493 }
16494 }
16495 break;
16496 }
16497 default:
16498 takeCharges = true;
16499 break;
16500 }
16501 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16502 }
16503 // Remove charge (aura can be removed by triggers)
16504 // xinef: take into account attribute6 of proc spell
16505 if (prepare && useCharges && takeCharges)
16506 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16507 i->aura->DropCharge();
16508
16509 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16510
16512 SetCantProc(false);
16513 }
16514
16515 // Cleanup proc requirements
16517 SetCantProc(false);
16518}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition ConditionMgr.h:148
@ EFFECT_2
Definition SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition SharedDefines.h:523
#define EFFECT_ALL
Definition SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition SharedDefines.h:620
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition SpellMgr.h:218
@ PROC_FLAG_DONE_PERIODIC
Definition SpellMgr.h:134
static bool isNonTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:107
static bool isTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:105
std::list< ProcTriggeredData > ProcTriggeredList
Definition Unit.cpp:15865
@ REACTIVE_OVERPOWER
Definition Unit.h:605
@ REACTIVE_DEFENSE
Definition Unit.h:603
@ REACTIVE_HUNTER_PARRY
Definition Unit.h:604
@ REACTIVE_WOLVERINE_BITE
Definition Unit.h:606
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition SpellAuraEffects.cpp:7270
SpellModifier * GetSpellModifier() const
Definition SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition SpellAuras.h:108
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1025
Definition Unit.h:422
void SetProcCooldown(uint32 cooldown)
Definition Unit.h:456
Unit * GetActionTarget() const
Definition Unit.h:442
Unit * GetProcTarget() const
Definition Unit.h:443
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition Unit.cpp:9009
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition Unit.cpp:17598
bool IsHunterPet() const
Definition Unit.h:781
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition Unit.cpp:17445
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition Unit.cpp:8814
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition Unit.h:1303
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition Unit.cpp:6688
void StartReactiveTimer(ReactiveType reactive)
Definition Unit.h:1809
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition Unit.cpp:9912
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition Unit.cpp:17687
Definition Unit.cpp:15846

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11976{
11977 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11978 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11979
11980 // .. taken pct: dummy auras
11981 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11982 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11983 {
11984 if (!(*i) || !(*i)->GetSpellInfo())
11985 {
11986 continue;
11987 }
11988
11989 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
11990 {
11991 switch (spellIconId)
11992 {
11993 // Cheat Death
11994 case 2109:
11995 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
11996 {
11997 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
11998 // is 22.5% critical strike damage reduction, or 444 resilience.
11999 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
12000 float mod = -1.0f * GetMeleeCritDamageReduction(400);
12001 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
12002 }
12003 break;
12004 }
12005 }
12006 }
12007 return TakenTotalMod;
12008}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4323{
4326}
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4328
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition Object.cpp:1171

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4329{
4330 if (IsCreature())
4332
4333 if (IsFlying() || (!IsControlledByPlayer()))
4334 return;
4335
4336 LiquidData const& liquidData = GetLiquidData();
4337
4338 // remove appropriate auras if we are swimming/not swimming respectively - exact mirror of client logic
4339 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING && (liquidData.Level - GetPositionZ()) > GetCollisionHeight() * 0.75f) // Shallow water at ~75% of collision height)
4341 else
4343
4344 // liquid aura handling
4345 LiquidTypeEntry const* curLiquid = nullptr;
4346 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4347 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4348
4349 if (curLiquid != _lastLiquid)
4350 {
4353
4354 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4355 _lastLiquid = curLiquid;
4356
4358 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4359 CastSpell(this, curLiquid->SpellId, true);
4360 }
4361}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void UpdateMovementFlags()
Definition Creature.cpp:3326
bool IsFlying() const
Definition Unit.h:1668
Definition GridTerrainData.h:199
float Level
Definition GridTerrainData.h:204
uint32 Entry
Definition GridTerrainData.h:202
Definition DBCStructure.h:1284
uint32 SpellId
Definition DBCStructure.h:1290

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCollisionHeight(), WorldObject::GetLiquidData(), Position::GetPositionZ(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), LiquidData::Level, MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1543{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition MotionMaster.cpp:926

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16777{
16779 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16780 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16781 SetObjectScale(std::max(scale, scaleMin));
16782}
@ SPELL_AURA_MOD_SCALE_2
Definition SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition Object.h:120
virtual float GetNativeObjectScale() const
Definition Unit.h:1926

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10561{
10562 while (!m_attackers.empty())
10563 {
10564 AttackerSet::iterator iter = m_attackers.begin();
10565 if (!(*iter)->AttackStop())
10566 {
10567 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10568 m_attackers.erase(iter);
10569 }
10570 }
10571}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), boss_attumen::SpellHit(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5388{
5389 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5390 // we want to have all auras removed, so use your brain when linking events
5391 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5392 {
5393 AuraApplicationMap::iterator aurAppIter;
5394 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5396
5397 AuraMap::iterator aurIter;
5398 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5399 RemoveOwnedAura(aurIter);
5400 }
5401}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::Reset(), boss_loken::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5462{
5463 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5464 {
5465 Aura const* aura = iter->second->GetBase();
5466 if (aura->GetSpellInfo()->HasAura(type))
5467 ++iter;
5468 else
5470 }
5471
5472 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5473 {
5474 Aura* aura = iter->second;
5475 if (aura->GetSpellInfo()->HasAura(type))
5476 ++iter;
5477 else
5479 }
5480}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5418{
5419 // used just after dieing to remove all visible auras
5420 // and disable the mods for the passive ones
5421 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5422 {
5423 Aura const* aura = iter->second->GetBase();
5426 else
5427 ++iter;
5428 }
5429
5430 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5431 {
5432 Aura* aura = iter->second;
5435 else
5436 ++iter;
5437 }
5438}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition SharedDefines.h:654
@ AURA_REMOVE_BY_DEATH
Definition SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5441{
5442 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5443 {
5444 Aura const* aura = iter->second->GetBase();
5445 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5447 else
5448 ++iter;
5449 }
5450
5451 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5452 {
5453 Aura* aura = iter->second;
5454 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5456 else
5457 ++iter;
5458 }
5459}
bool IsRequiringDeadTarget() const
Definition SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11163{
11164 // possessed pet and vehicle
11165 if (IsPlayer())
11167
11168 while (!m_Controlled.empty())
11169 {
11170 Unit* target = *m_Controlled.begin();
11171 m_Controlled.erase(m_Controlled.begin());
11172 if (target->GetCharmerGUID() == GetGUID())
11173 {
11174 target->RemoveCharmAuras();
11175 }
11176 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11177 {
11178 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11179 {
11180 target->ToTempSummon()->UnSummon();
11181 }
11182 }
11183 else
11184 {
11185 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11186 }
11187 }
11188}
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9364
bool IsGuardian() const
Definition Unit.h:778
void RemoveCharmAuras()
Definition Unit.cpp:11270

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6263{
6264 while (!m_dynObj.empty())
6265 m_dynObj.front()->Remove();
6266}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6363{
6364 while(!m_gameObj.empty())
6365 {
6366 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6367 if (go)
6368 {
6370 go->SetRespawnTime(0);
6371 go->Delete();
6372 }
6373 m_gameObj.erase(m_gameObj.begin());
6374 }
6375}
void Delete()
Definition GameObject.cpp:978
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1284

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10940{
10941 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10942 {
10943 Unit* unit = *itr;
10944 ++itr;
10945 if (unit->GetEntry() == entry && unit->IsCreature()
10946 && unit->ToCreature()->IsSummon()) // minion, actually
10947 unit->ToTempSummon()->UnSummon();
10948 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10949 }
10950}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4939{
4940 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4941 {
4942 if (check(iter->second))
4943 {
4944 RemoveAura(iter);
4945 continue;
4946 }
4947 ++iter;
4948 }
4949}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4965{
4966 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4967 {
4968 if (check(iter->second))
4969 {
4970 RemoveAura(iter);
4971 continue;
4972 }
4973 ++iter;
4974 }
4975}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5355{
5356 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5357 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5358 {
5359 Aura* aura = iter->second;
5360 ++iter;
5361 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5362 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5363 {
5364 AuraApplication* aurApp = itr->second;
5365 ++itr;
5366 Unit* target = aurApp->GetTarget();
5367 if (target == this)
5368 continue;
5369 target->RemoveAura(aurApp);
5370 // things linked on aura remove may apply new area aura - so start from the beginning
5371 iter = m_ownedAuras.begin();
5372 }
5373 }
5374
5375 // remove area auras owned by others
5376 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5377 {
5378 if (iter->second->GetBase()->GetOwner() != this)
5379 {
5380 RemoveAura(iter);
5381 }
5382 else
5383 ++iter;
5384 }
5385}
ApplicationMap const & GetApplicationMap()
Definition SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5404{
5405 // in join, remove positive buffs, on end, remove negative
5406 // used to remove positive visible auras in arenas
5407 RemoveAppliedAuras([](AuraApplication const* aurApp)
5408 {
5409 Aura const* aura = aurApp->GetBase();
5410 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5411 && !aura->IsPassive() // don't remove passive auras
5412 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5413 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5414 });
5415}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition SharedDefines.h:580
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition SharedDefines.h:524
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition SharedDefines.h:562
bool IsPositive() const
Definition SpellAuras.h:68
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition Unit.cpp:4938

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Battleground::AddPlayer().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4918{
4919 if (aura->IsRemoved())
4920 return;
4921 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4922 RemoveAura(aurApp, mode);
4923}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4875{
4876 // we've special situation here, RemoveAura called while during aura removal
4877 // this kind of call is needed only when aura effect removal handler
4878 // or event triggered by it expects to remove
4879 // not yet removed effects of an aura
4880 if (aurApp->GetRemoveMode())
4881 {
4882 // remove remaining effects of an aura
4883 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4884 {
4885 if (aurApp->HasEffect(itr))
4886 aurApp->_HandleEffect(itr, false);
4887 }
4888 return;
4889 }
4890 // no need to remove
4891 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4892 return;
4893
4894 uint32 spellId = aurApp->GetBase()->GetId();
4895 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4896
4897 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4898 {
4899 if (aurApp == iter->second)
4900 {
4901 // Prevent Arena Preparation aura from being removed by player actions
4902 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4903 // Should only be removed by the arena script, once the match starts.
4905 {
4906 return;
4907 }
4908
4909 RemoveAura(iter, mode);
4910 return;
4911 }
4912 else
4913 ++iter;
4914 }
4915}
@ SPELL_AURA_ARENA_PREPARATION
Definition SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4845{
4846 AuraApplication* aurApp = i->second;
4847 // Do not remove aura which is already being removed
4848 if (aurApp->GetRemoveMode())
4849 return;
4850 Aura* aura = aurApp->GetBase();
4851 _UnapplyAura(i, mode);
4852 // Remove aura - for Area and Target auras
4853 if (aura->GetOwner() == this)
4854 aura->Remove(mode);
4855}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), Spell::finish(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), spell_handover_reins::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAura(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4858{
4859 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4860 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4861 {
4862 Aura const* aura = iter->second->GetBase();
4863 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4864 && (!caster || aura->GetCasterGUID() == caster))
4865 {
4866 RemoveAura(iter, removeMode);
4867 return;
4868 }
4869 else
4870 ++iter;
4871 }
4872}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4994{
4995 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4996 for (AuraMap::iterator iter = range.first; iter != range.second;)
4997 {
4998 Aura* aura = iter->second;
4999 if ((aura->GetType() == UNIT_AURA_TYPE)
5000 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
5001 {
5002 aura->ModStackAmount(-1, removeMode);
5003 return;
5004 }
5005 else
5006 ++iter;
5007 }
5008}
@ UNIT_AURA_TYPE
Definition SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5339{
5340 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5341 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5342 {
5343 Aura const* aura = iter->second->GetBase();
5344 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5346 {
5347 RemoveAura(iter);
5348 continue;
5349 }
5350 ++iter;
5351 }
5352}
@ SPELL_ATTR0_CU_AURA_CC
Definition SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition SpellInfo.cpp:2003

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5179{
5180 // simple check if list is empty
5181 if (m_modAuras[auraType].empty())
5182 return;
5183
5184 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5185 {
5186 Aura* aura = (*iter)->GetBase();
5188
5189 ++iter;
5190 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5191 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5192 {
5193 uint32 removedAuras = m_removedAurasCount;
5194 RemoveAura(aurApp);
5195 if (m_removedAurasCount > removedAuras)
5196 iter = m_modAuras[auraType].begin();
5197 }
5198 }
5199}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5154{
5155 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5156 {
5157 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5158 {
5159 RemoveAura(iter);
5160 iter = m_appliedAuras.lower_bound(spellId);
5161 }
5162 else
5163 ++iter;
5164 }
5165
5166 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5167 {
5168 if (iter->second->GetCastItemGUID() == castItemGuid)
5169 {
5171 iter = m_ownedAuras.lower_bound(spellId);
5172 }
5173 else
5174 ++iter;
5175 }
5176}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4978{
4979 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4980 {
4981 Aura const* aura = iter->second->GetBase();
4982 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4983 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4984 {
4985 RemoveAura(iter, removeMode);
4986 iter = m_appliedAuras.lower_bound(spellId);
4987 }
4988 else
4989 ++iter;
4990 }
4991}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), Player::ApplyItemObtainSpells(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), spell_amanitar_remove_mushroom_power::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), group_commandscript::HandleGroupReviveCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_tenris_mirkblood::KilledUnit(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), spell_quest_test_flight_charging::PerformKick(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_Graveyard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
5011{
5012 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5013 for (AuraMap::iterator iter = range.first; iter != range.second;)
5014 {
5015 Aura* aura = iter->second;
5016 if (aura->GetCasterGUID() == casterGUID)
5017 {
5018 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
5019
5020 // Call OnDispel hook on AuraScript
5021 aura->CallScriptDispel(&dispelInfo);
5022
5024 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5025 else
5026 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5027
5028 // Call AfterDispel hook on AuraScript
5029 aura->CallScriptAfterDispel(&dispelInfo);
5030
5031 switch (aura->GetSpellInfo()->SpellFamilyName)
5032 {
5033 case SPELLFAMILY_HUNTER:
5034 {
5035 // Noxious Stings
5036 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5037 {
5038 if (Unit* caster = aura->GetCaster())
5039 {
5040 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5041 {
5042 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5043 {
5044 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5045 if (aura->GetUnitOwner())
5046 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5047 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5048 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5049 }
5050 }
5051 }
5052 }
5053 break;
5054 }
5056 {
5057 // Icy Clutch, remove with Frost Fever
5058 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5059 {
5060 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5061 RemoveAurasDueToSpell(aureff->GetId());
5062 }
5063 }
5064 default:
5065 break;
5066 }
5067 return;
5068 }
5069 else
5070 ++iter;
5071 }
5072}
void CallScriptDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2403
Definition Unit.h:298

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5075{
5076 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5077 for (AuraMap::iterator iter = range.first; iter != range.second;)
5078 {
5079 Aura* aura = iter->second;
5080 if (aura->GetCasterGUID() == casterGUID)
5081 {
5082 int32 damage[MAX_SPELL_EFFECTS];
5083 int32 baseDamage[MAX_SPELL_EFFECTS];
5084 uint8 effMask = 0;
5085 uint8 recalculateMask = 0;
5086 Unit* caster = aura->GetCaster();
5087 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5088 {
5089 if (aura->GetEffect(i))
5090 {
5091 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5092 damage[i] = aura->GetEffect(i)->GetAmount();
5093 effMask |= (1 << i);
5094 if (aura->GetEffect(i)->CanBeRecalculated())
5095 recalculateMask |= (1 << i);
5096 }
5097 else
5098 {
5099 baseDamage[i] = 0;
5100 damage[i] = 0;
5101 }
5102 }
5103
5105 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5106 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5107
5108 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5109 {
5110 if (stealCharge)
5111 oldAura->ModCharges(1);
5112 else
5113 oldAura->ModStackAmount(1);
5114 oldAura->SetDuration(int32(dur));
5115 }
5116 else
5117 {
5118 // single target state must be removed before aura creation to preserve existing single target aura
5119 if (aura->IsSingleTarget())
5120 aura->UnregisterSingleTarget();
5121
5122 // Xinef: if stealer has same aura
5123 Aura* curAura = stealer->GetAura(aura->GetId());
5124 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5125 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5126 {
5127 // created aura must not be single target aura,, so stealer won't loose it on recast
5128 if (newAura->IsSingleTarget())
5129 {
5130 newAura->UnregisterSingleTarget();
5131 // bring back single target aura status to the old aura
5132 aura->SetIsSingleTarget(true);
5133 caster->GetSingleCastAuras().push_back(aura);
5134 }
5135 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5136 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5137 newAura->ApplyForTargets();
5138 }
5139 }
5140
5141 if (stealCharge)
5143 else
5145
5146 return;
5147 }
5148 else
5149 ++iter;
5150 }
5151}
bool CanBeRecalculated() const
Definition SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition SpellAuras.cpp:1167
bool IsPermanent() const
Definition SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5202{
5203 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5204 {
5205 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5206 if (spell->Attributes & flags)
5207 RemoveAura(iter);
5208 else
5209 ++iter;
5210 }
5211}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5285{
5286 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5287 {
5288 Aura const* aura = iter->second->GetBase();
5289 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5290 {
5291 SpellInfo const* spell = aura->GetSpellInfo();
5292 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5293 {
5294 RemoveAura(iter);
5295 continue;
5296 }
5297 }
5298 ++iter;
5299 }
5300}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5250{
5251 if (!(m_interruptMask & flag))
5252 return;
5253
5254 // interrupt auras
5255 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5256 {
5257 Aura* aura = (*iter)->GetBase();
5258 ++iter;
5259 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5260 {
5261 uint32 removedAuras = m_removedAurasCount;
5262 RemoveAura(aura);
5263 if (m_removedAurasCount > removedAuras + 1)
5264 iter = m_interruptableAuras.begin();
5265 }
5266 }
5267
5268 // interrupt channeled spell
5270 {
5271 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5272 {
5273 // Do not interrupt if auto shot
5274 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5275 {
5276 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5277 }
5278 }
5279 }
5280
5282}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMoverRelocation(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), WorldSession::ProcessMovementInfo(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5322{
5323 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5324 {
5325 Aura const* aura = iter->second->GetBase();
5326 if (!except || aura->GetId() != except)
5327 {
5328 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5329 {
5330 RemoveAura(iter, removemode);
5331 continue;
5332 }
5333 }
5334 ++iter;
5335 }
5336}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11266{
11268}
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18580{
18581 if (!IsCharmed())
18582 return;
18583
18584 if (!charmer)
18585 charmer = GetCharmer();
18586 if (charmer != GetCharmer()) // one aura overrides another?
18587 {
18588 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18589 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18590 // ABORT();
18591 return;
18592 }
18593
18594 CharmType type;
18596 type = CHARM_TYPE_POSSESS;
18597 else if (charmer && charmer->IsOnVehicle(this))
18598 type = CHARM_TYPE_VEHICLE;
18599 else
18600 type = CHARM_TYPE_CHARM;
18601
18602 if (_oldFactionId)
18603 {
18605 _oldFactionId = 0;
18606 }
18607 else
18609
18610 CastStop();
18611 AttackStop();
18612
18613 // xinef: update speed after charming
18614 UpdateSpeed(MOVE_RUN, false);
18615
18616 // xinef: do not break any controlled motion slot
18617 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18618 {
18619 StopMoving();
18621 }
18622 // xinef: if we have any controlled movement, clear active and idle only
18623 else
18625
18627
18628 // xinef: remove stunned flag if owner was mounted
18631
18632 // If charmer still exists
18633 if (!charmer)
18634 return;
18635
18636 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18637 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18638
18639 charmer->SetCharm(this, false);
18640
18642
18643 Player* playerCharmer = charmer->ToPlayer();
18644 if (playerCharmer)
18645 {
18646 switch (type)
18647 {
18648 case CHARM_TYPE_VEHICLE:
18649 playerCharmer->SetClientControl(this, false);
18650 playerCharmer->SetClientControl(charmer, true); // verified
18653 break;
18654 case CHARM_TYPE_POSSESS:
18655 playerCharmer->SetClientControl(this, false);
18656 playerCharmer->SetClientControl(charmer, true); // verified
18661 break;
18662 case CHARM_TYPE_CHARM:
18664 {
18666 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18667 {
18669 if (GetCharmInfo())
18670 GetCharmInfo()->SetPetNumber(0, true);
18671 else
18672 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18673 }
18674 }
18675 break;
18676 default:
18677 break;
18678 }
18679 }
18680
18681 if (Player* player = ToPlayer())
18682 {
18683 sScriptMgr->AnticheatSetUnderACKmount(player);
18684 }
18685
18686 // xinef: restore threat
18687 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18688 {
18689 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18690 if (!IsFriendlyTo(target))
18691 AddThreat(target, itr->second);
18692 }
18693
18694 _charmThreatInfo.clear();
18695
18696 if (Creature* creature = ToCreature())
18697 {
18698 // Vehicle should not attack its passenger after he exists the seat
18699 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18700 if (Attack(charmer, true))
18701 GetMotionMaster()->MoveChase(charmer);
18702
18703 // Creature will restore its old AI on next update
18704 if (creature->AI())
18705 creature->AI()->OnCharmed(false);
18706
18707 // Xinef: Remove movement flag flying
18709 }
18710 else
18711 ToPlayer()->SetClientControl(this, true); // verified
18712
18713 // a guardian should always have charminfo
18714 if (playerCharmer && this != charmer->GetFirstControlled())
18715 playerCharmer->SendRemoveControlBar();
18716
18717 // xinef: Always delete charm info (restores react state)
18718 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18720}
CharmType
Definition CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition CharmInfo.h:47
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition MotionMaster.h:58
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2641
@ CLASS_CONTEXT_PET_CHARM
Definition UnitDefines.h:241
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition UnitDefines.h:198
@ MOVE_RUN
Definition UnitDefines.h:354
void InitDefault()
Definition MotionMaster.cpp:88
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:209
void MovementExpired(bool reset=true)
Definition MotionMaster.h:195
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:739
void SendRemoveControlBar()
Definition Player.cpp:9781
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12902
void DeleteCharmInfo()
Definition Unit.cpp:15830
void RestoreFaction()
Definition Unit.cpp:18722
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:10952
void StopAttackingInvalidTarget()
Definition Unit.cpp:19964
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1187
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10323
CharmThreatMap _charmThreatInfo
Definition Unit.h:2152
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:758
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition Unit.cpp:14334
uint32 unit_class
Definition CreatureData.h:213

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
1002{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6241{
6242 if (m_dynObj.empty())
6243 return false;
6244
6245 bool result = false;
6246 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6247 {
6248 DynamicObject* dynObj = *i;
6249 if (dynObj->GetSpellId() == spellId)
6250 {
6251 dynObj->Remove();
6252 i = m_dynObj.begin();
6253 result = true;
6254 }
6255 else
6256 ++i;
6257 }
6258
6259 return result;
6260}
void Remove()
Definition DynamicObject.cpp:180

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5506{
5507 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5508 {
5509 Aura const* aura = iter->second->GetBase();
5510 SpellInfo const* spellInfo = aura->GetSpellInfo();
5512 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5513 ++iter;
5514 else
5516 }
5517
5518 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5519 {
5520 Aura* aura = iter->second;
5521 SpellInfo const* spellInfo = aura->GetSpellInfo();
5523 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5524 ++iter;
5525 else
5527 }
5528}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition SharedDefines.h:455
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), ObjectGuid::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1849{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from Object.

15708{
15709 // cleanup
15710 ASSERT(GetGUID());
15711
15712 if (IsInWorld())
15713 {
15715 if (IsVehicle())
15717
15721
15724
15725 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15728
15730
15731 if (GetCharmerGUID())
15732 {
15733 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15734 ABORT();
15735 }
15736
15737 if (Unit* owner = GetOwner())
15738 {
15739 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15740 {
15742 owner->SetMinion((Minion*)this, false);
15743 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15744 //ABORT();
15745 }
15746 }
15747
15750 }
15751}
void RemoveNotOwnSingleTargetAuras()
Definition Unit.cpp:5213
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11278
void RemoveAllDynObjects()
Definition Unit.cpp:6262
void RemoveAreaAurasDueToLeaveWorld()
Definition Unit.cpp:5354
void RemoveBindSightAuras()
Definition Unit.cpp:11265
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11162
void RemoveFromWorld() override
Definition Object.cpp:1207

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6297{
6298 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6299 return;
6300
6302
6303 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6304 {
6305 if (m_ObjectSlot[i] == gameObj->GetGUID())
6306 {
6307 m_ObjectSlot[i].Clear();
6308 break;
6309 }
6310 }
6311
6312 // GO created by some spell
6313 if (uint32 spellid = gameObj->GetSpellId())
6314 {
6315 RemoveAurasDueToSpell(spellid);
6316
6317 if (IsPlayer())
6318 {
6319 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6320 // Need activate spell use for owner
6321 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6322 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6323 ToPlayer()->SendCooldownEvent(createBySpell);
6324 }
6325 }
6326
6327 m_gameObj.remove(gameObj->GetGUID());
6328
6329 if (del)
6330 {
6331 gameObj->SetRespawnTime(0);
6332 gameObj->Delete();
6333 }
6334}
void Clear()
Definition ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11127

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6337{
6338 if (m_gameObj.empty())
6339 return;
6340
6341 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6342 {
6343 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6344 {
6345 if (spellid > 0 && go->GetSpellId() != spellid)
6346 {
6347 ++itr;
6348 continue;
6349 }
6350
6351 go->SetOwnerGUID(ObjectGuid::Empty);
6352 if (del)
6353 {
6354 go->SetRespawnTime(0);
6355 go->Delete();
6356 }
6357 }
6358 m_gameObj.erase(itr++);
6359 }
6360}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
939{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5303{
5304 if (withRoot)
5306
5307 // Snares
5308 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5309 {
5310 Aura const* aura = iter->second->GetBase();
5312 {
5313 RemoveAura(iter);
5314 continue;
5315 }
5316
5317 ++iter;
5318 }
5319}
bool HasEffectMechanic(Mechanics mechanic) const
Definition SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5214{
5215 // single target auras from other casters
5216 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5217 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5218 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5219 // leading to assertion failures if the aura was cast on a player that can
5220 // (and is changing map at the point where this function is called).
5221 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5222 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5223 // to register in m_appliedAuras
5224 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5225 {
5226 Aura const* aura = iter->second;
5227
5228 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5229 RemoveOwnedAura(iter);
5230 else
5231 ++iter;
5232 }
5233
5234 // single target auras at other targets
5235 AuraList& scAuras = GetSingleCastAuras();
5236 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5237 {
5238 Aura* aura = *iter;
5239 if (aura->GetUnitOwner() != this)
5240 {
5241 aura->Remove();
5242 iter = scAuras.begin();
5243 }
5244 else
5245 ++iter;
5246 }
5247}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
750{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4807{
4808 if (aura->IsRemoved())
4809 return;
4810
4811 ASSERT(aura->GetOwner() == this);
4812
4813 uint32 spellId = aura->GetId();
4814 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4815
4816 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4817 {
4818 if (itr->second == aura)
4819 {
4820 RemoveOwnedAura(itr, removeMode);
4821 return;
4822 }
4823 }
4824
4825 ABORT();
4826}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4774{
4775 Aura* aura = i->second;
4776 ASSERT(!aura->IsRemoved());
4777
4778 // if unit currently update aura list then make safe update iterator shift to next
4781
4782 m_ownedAuras.erase(i);
4783 m_removedAuras.push_back(aura);
4784
4785 // Unregister single target aura
4786 if (aura->IsSingleTarget())
4787 aura->UnregisterSingleTarget();
4788
4789 aura->_Remove(removeMode);
4790
4791 i = m_ownedAuras.begin();
4792}
void _Remove(AuraRemoveMode removeMode)
Definition SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAura(), RemoveOwnedAuras(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4795{
4796 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4797 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4798 {
4799 RemoveOwnedAura(itr, removeMode);
4800 itr = m_ownedAuras.lower_bound(spellId);
4801 }
4802 else
4803 ++itr;
4804}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4926{
4927 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4928 {
4929 if (check(iter->second))
4930 {
4931 RemoveOwnedAura(iter);
4932 continue;
4933 }
4934 ++iter;
4935 }
4936}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4952{
4953 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4954 {
4955 if (check(iter->second))
4956 {
4957 RemoveOwnedAura(iter);
4958 continue;
4959 }
4960 ++iter;
4961 }
4962}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17332{
17333 if (!IsPlayer())
17334 return;
17335
17336 m_petAuras.erase(petSpell);
17337 if (Pet* pet = ToPlayer()->GetPet())
17338 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17339 if (Unit* charm = GetCharm())
17340 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17341}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
Todo:
: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active
11256{
11257 m_sharedVision.remove(player);
11258 player->m_isInSharedVisionOf.erase(this);
11259
11261 if (m_sharedVision.empty())
11262 setActive(false);
11263}

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:919

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

734{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by at_hol_hall_of_watchers::_OnTrigger(), spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), Player::SetBeastMaster(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18755{
18756 if (!m_vehicleKit)
18757 return;
18758
18760 delete m_vehicleKit;
18761
18762 m_vehicleKit = nullptr;
18763
18764 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18765 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18767}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:343
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition UnitDefines.h:344
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:750

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1507{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition Unit.cpp:17191

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), GameEventMgr::UpdateEventNPCFlags(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
1015 {
1016 if (FactionTemplateEntry const* entry = GetFactionTemplateEntry())
1017 return entry->FactionRespondsToCallForHelp();
1018
1019 return false;
1020 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16798{
16799 AuraEffect* handledAura = nullptr;
16800 AuraEffect* handledAuraForced = nullptr;
16801 // try to receive model from transform auras
16803 if (!transforms.empty())
16804 {
16805 // iterate over already applied transform auras - from newest to oldest
16806 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16807 {
16808 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16809 {
16810 if (!handledAura)
16811 handledAura = (*i);
16812 // xinef: prefer negative/forced auras
16813 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16814 {
16815 handledAuraForced = (*i);
16816 break;
16817 }
16818 }
16819 }
16820 }
16821
16822 // Xinef: include clone auras (eg mirror images)
16823 if (!handledAuraForced && !handledAura)
16824 {
16826 if (!cloneAuras.empty())
16827 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16828 handledAura = *i;
16829 }
16830
16832
16833 // xinef: order of execution is important!
16834 // first forced transform auras, then shapeshifts, then normal transform
16835 // transform aura was found
16836 if (handledAuraForced)
16837 {
16838 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16839 return;
16840 }
16841 else if (!shapeshiftAura.empty()) // we've found shapeshift
16842 {
16843 // only one such aura possible at a time
16844 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16845 {
16846 SetDisplayId(modelId);
16847 return;
16848 }
16849 }
16850 else if (handledAura)
16851 {
16852 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16853 return;
16854 }
16855
16856 // no auras found - set modelid to default
16858}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuraEffects.cpp:748
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId)
Definition Unit.cpp:19225

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18723{
18724 if (IsPlayer())
18726 else
18727 {
18729 {
18730 if (Unit* owner = GetOwner())
18731 {
18732 SetFaction(owner->GetFaction());
18733 return;
18734 }
18735 }
18736
18737 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18738 SetFaction(cinfo->faction);
18739 }
18740}
void SetFactionForRace(uint8 race)
Definition Player.cpp:5868

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16687{
16688 if (slot >= MAX_MOTION_SLOT)
16689 return;
16690
16691 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16692 movementGenerator->Resume(timer);
16693}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
19898{
19899 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
19900 float addRage;
19901
19902 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
19903
19904 // Unknown if correct, but lineary adjust rage conversion above level 70
19905 if (GetLevel() > 70)
19906 rageconversion += 13.27f * (GetLevel() - 70);
19907
19908 if (attacker)
19909 {
19910 // see Bornak's bluepost explanation (05/29/2009)
19911 float rageFromDamageDealt = damage / rageconversion * 7.5f;
19912 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
19913 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
19915 }
19916 else
19917 {
19918 addRage = damage / rageconversion * 2.5f;
19919
19920 // Berserker Rage effect
19921 if (HasAura(18499))
19922 addRage *= 3.0f;
19923 }
19924
19925 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
19926
19927 ModifyPower(POWER_RAGE, uint32(addRage * 10));
19928}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition WorldConfig.h:390

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2821{
2822 // This is only wrapper
2823
2824 // Miss chance based on melee
2825 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2826 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2827
2828 // Critical hit chance
2829 float crit_chance = GetUnitCriticalChance(attType, victim);
2830 if (crit_chance < 0)
2831 crit_chance = 0;
2832
2833 float dodge_chance = victim->GetUnitDodgeChance();
2834 float block_chance = victim->GetUnitBlockChance();
2835 float parry_chance = victim->GetUnitParryChance();
2836
2837 // Useful if want to specify crit & miss chances for melee, else it could be removed
2838 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2839
2840 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2841}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition Unit.cpp:3765

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2844{
2845 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2846 {
2847 return MELEE_HIT_EVADE;
2848 }
2849
2850 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2851 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2852
2853 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2854 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2855
2856 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2857
2858 // bonus from skills is 0.04%
2859 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2860 int32 sum = 0, tmp = 0;
2861 int32 roll = urand (0, 10000);
2862
2863 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2864 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2865 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2866
2867 tmp = miss_chance;
2868
2869 if (tmp > 0 && roll < (sum += tmp))
2870 {
2871 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2872 return MELEE_HIT_MISS;
2873 }
2874
2875 // Dodge chance
2876
2877 // only players can't dodge if attacker is behind
2878 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2879 {
2880 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2881 }
2882 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2883 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2884 {
2885 // Reduce dodge chance by attacker expertise rating
2886 if (IsPlayer())
2887 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2888 else
2889 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2890
2891 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2893 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2894
2895 tmp = dodge_chance;
2896
2897 // xinef: if casting or stunned - cant dodge
2898 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2899 tmp = 0;
2900
2901 if ((tmp > 0) // check if unit _can_ dodge
2902 && ((tmp -= skillBonus) > 0)
2903 && roll < (sum += tmp))
2904 {
2905 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2906 return MELEE_HIT_DODGE;
2907 }
2908 }
2909
2910 // parry & block chances
2911
2912 // check if attack comes from behind, nobody can parry or block if attacker is behind
2913 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2914 {
2915 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2916 }
2917 else
2918 {
2919 // Reduce parry chance by attacker expertise rating
2920 if (IsPlayer())
2921 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2922 else
2923 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2924
2925 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2926 {
2927 tmp = parry_chance;
2928
2929 // xinef: cant parry while casting or while stunned
2930 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2931 tmp = 0;
2932
2933 if (tmp > 0 // check if unit _can_ parry
2934 && (tmp -= skillBonus) > 0
2935 && roll < (sum += tmp))
2936 {
2937 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2938 return MELEE_HIT_PARRY;
2939 }
2940 }
2941
2942 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2943 {
2944 tmp = block_chance;
2945
2946 // xinef: cant block while casting or while stunned
2947 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2948 tmp = 0;
2949
2950 if (tmp > 0 // check if unit _can_ block
2951 && (tmp -= skillBonus) > 0
2952 && roll < (sum += tmp))
2953 {
2954 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2955 return MELEE_HIT_BLOCK;
2956 }
2957 }
2958 }
2959
2960 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2961 if (attType != RANGED_ATTACK &&
2962 (IsPlayer() || IsPet()) &&
2963 !victim->IsPlayer() && !victim->IsPet() &&
2964 GetLevel() < victim->getLevelForTarget(this))
2965 {
2966 // cap possible value (with bonuses > max skill)
2967 int32 skill = attackerWeaponSkill;
2968 int32 maxskill = attackerMaxSkillValueForLevel;
2969 skill = (skill > maxskill) ? maxskill : skill;
2970
2971 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2972 tmp = tmp > 4000 ? 4000 : tmp;
2973 if (roll < (sum += tmp))
2974 {
2975 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2976 return MELEE_HIT_GLANCING;
2977 }
2978 }
2979
2980 // mobs can score crushing blows if they're 4 or more levels above victim
2981 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2982 // can be from by creature (if can) or from controlled player that considered as creature
2985 {
2986 // when their weapon skill is 15 or more above victim's defense skill
2987 tmp = victimDefenseSkill;
2988 int32 tmpmax = victimMaxSkillValueForLevel;
2989 // having defense above your maximum (from items, talents etc.) has no effect
2990 tmp = tmp > tmpmax ? tmpmax : tmp;
2991 // tmp = mob's level * 5 - player's current defense skill
2992 tmp = attackerMaxSkillValueForLevel - tmp;
2993 if (tmp >= 15)
2994 {
2995 // add 2% chance per lacking skill point, min. is 15%
2996 tmp = tmp * 200 - 1500;
2997 if (roll < (sum += tmp))
2998 {
2999 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
3000 return MELEE_HIT_CRUSHING;
3001 }
3002 }
3003 }
3004
3005 // Critical chance
3006 tmp = crit_chance;
3007
3008 if (tmp > 0 && roll < (sum += tmp))
3009 {
3010 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
3011 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
3012 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
3013 else
3014 return MELEE_HIT_CRIT;
3015 }
3016
3017 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
3018 return MELEE_HIT_NORMAL;
3019}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21076{
21077 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21078}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17042{
17043 std::list<Unit*> targets;
17044 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17046 Cell::VisitObjects(this, searcher, dist);
17047
17048 // remove current target
17049 if (GetVictim())
17050 targets.remove(GetVictim());
17051
17052 if (exclude)
17053 targets.remove(exclude);
17054
17055 // remove not LoS targets
17056 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17057 {
17058 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17059 {
17060 std::list<Unit*>::iterator tIter2 = tIter;
17061 ++tIter;
17062 targets.erase(tIter2);
17063 }
17064 else
17065 ++tIter;
17066 }
17067
17068 // no appropriate targets
17069 if (targets.empty())
17070 return nullptr;
17071
17072 // select random
17074}
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:13955
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:133
Definition GridNotifiers.h:414

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17007{
17008 std::list<Unit*> targets;
17009 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17011 Cell::VisitObjects(this, searcher, dist);
17012
17013 // remove current target
17014 if (GetVictim())
17015 targets.remove(GetVictim());
17016
17017 if (exclude)
17018 targets.remove(exclude);
17019
17020 // remove not LoS targets
17021 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17022 {
17023 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17024 {
17025 std::list<Unit*>::iterator tIter2 = tIter;
17026 ++tIter;
17027 targets.erase(tIter2);
17028 }
17029 else
17030 ++tIter;
17031 }
17032
17033 // no appropriate targets
17034 if (targets.empty())
17035 return nullptr;
17036
17037 // select random
17039}
Definition GridNotifiers.h:852

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitObjects().

Referenced by npc_pet_dk_army_of_the_dead::IsSummonedBy(), boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6579{
6580 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6581
6582 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6583 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6584 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6585 {
6586 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6587 tmpDamage[i] = damageInfo->damages[i].damage;
6588 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6589 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6590 {
6591 tmpAbsorb[i] = tmpDamage[i];
6592 tmpDamage[i] = 0;
6593 }
6594 }
6595
6596 uint32 count = 1;
6597 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6598 {
6599 ++count;
6600 }
6601
6602 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6603 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6604 data << uint32(damageInfo->HitInfo);
6605 data << damageInfo->attacker->GetPackGUID();
6606 data << damageInfo->target->GetPackGUID();
6607 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6608 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6609 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6610 data << uint8(count); // Sub damage count
6611
6612 for (uint32 i = 0; i < count; ++i)
6613 {
6614 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6615 data << float(tmpDamage[i]); // sub damage
6616 data << uint32(tmpDamage[i]); // Sub Damage
6617 }
6618
6620 {
6621 for (uint32 i = 0; i < count; ++i)
6622 {
6623 data << uint32(tmpAbsorb[i]); // Absorb
6624 }
6625 }
6626
6628 {
6629 for (uint32 i = 0; i < count; ++i)
6630 {
6631 data << uint32(damageInfo->damages[i].resist); // Resist
6632 }
6633 }
6634
6635 data << uint8(damageInfo->TargetState);
6636 data << uint32(0); // Unknown attackerstate
6637 data << uint32(0); // Melee spellid
6638
6639 if (damageInfo->HitInfo & HITINFO_BLOCK)
6640 data << uint32(damageInfo->blocked_amount);
6641
6642 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6643 data << uint32(0);
6644
6646 if (damageInfo->HitInfo & HITINFO_UNK1)
6647 {
6648 data << uint32(0);
6649 data << float(0);
6650 data << float(0);
6651 data << float(0);
6652 data << float(0);
6653 data << float(0);
6654 data << float(0);
6655 data << float(0);
6656 data << float(0);
6657 data << float(0); // Found in a loop with 1 iteration
6658 data << float(0); // ditto ^
6659 data << uint32(0);
6660 }
6661
6662 SendMessageToSet(&data, true);
6663}
@ HITINFO_RAGE_GAIN
Definition Unit.h:122
@ HITINFO_UNK1
Definition Unit.h:99
@ SMSG_ATTACKERSTATEUPDATE
Definition Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6666{
6667 CalcDamageInfo dmgInfo;
6668 dmgInfo.HitInfo = HitInfo;
6669 dmgInfo.attacker = this;
6670 dmgInfo.target = target;
6671
6672 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6673 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6674 dmgInfo.damages[0].absorb = AbsorbDamage;
6675 dmgInfo.damages[0].resist = Resist;
6676
6677 dmgInfo.damages[1].damage = 0;
6678 dmgInfo.damages[1].damageSchoolMask = 0;
6679 dmgInfo.damages[1].absorb = 0;
6680 dmgInfo.damages[1].resist = 0;
6681
6682 dmgInfo.TargetState = TargetState;
6683 dmgInfo.blocked_amount = BlockedAmount;
6684 SendAttackStateUpdate(&dmgInfo);
6685}
HitInfo
Definition Unit.h:97

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
19860{
19861 if (!GetThreatMgr().isThreatListEmpty())
19862 {
19863 uint32 count = GetThreatMgr().GetThreatList().size();
19864
19865 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
19866 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
19867 data << GetPackGUID();
19868 data << pHostileReference->getUnitGuid().WriteAsPacked();
19869 data << uint32(count);
19871 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19872 {
19873 data << (*itr)->getUnitGuid().WriteAsPacked();
19874 data << uint32((*itr)->GetThreat() * 100);
19875 }
19876 SendMessageToSet(&data, false);
19877 }
19878}
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
std::list< HostileReference * > StorageType
Definition ThreatMgr.h:147
@ SMSG_HIGHEST_THREAT_UPDATE
Definition Opcodes.h:1184

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20088{
20090 data << GetPackGUID();
20091 SendMessageToSet(&data, false);
20092}
@ SMSG_BREAK_TARGET
Definition Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
19881{
19882 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
19884 data << GetPackGUID();
19885 SendMessageToSet(&data, false);
19886}
@ SMSG_THREAT_CLEAR
Definition Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16904{
16905 if (m_cleanupDone)
16906 {
16907 return;
16908 }
16909
16911 if (Player* playerMe = ToPlayer())
16912 {
16913 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16914 data << packGUID;
16915 data << uint8(m_comboPoints);
16916 playerMe->SendDirectMessage(&data);
16917 }
16918
16919 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16920 Player* owner = nullptr;
16921 if (ownerGuid.IsPlayer())
16922 {
16923 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16924 }
16925
16926 if (m_movedByPlayer || owner)
16927 {
16928 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16929 data << GetPackGUID();
16930 data << packGUID;
16931 data << uint8(m_comboPoints);
16932
16933 if (m_movedByPlayer)
16935
16936 if (owner && owner != m_movedByPlayer)
16937 owner->SendDirectMessage(&data);
16938 }
16939}
Definition ObjectGuid.h:263
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition Opcodes.h:955

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11334{
11335 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11336 data << victim->GetPackGUID();
11337 data << GetPackGUID();
11338 data << uint32(spellID);
11339 data << uint32(powerType);
11340 data << uint32(damage);
11341 SendMessageToSet(&data, true);
11342}
@ SMSG_SPELLENERGIZELOG
Definition Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11301{
11302 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11303
11304 // we guess size
11305 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11306 data << healInfo.GetTarget()->GetPackGUID();
11307 data << GetPackGUID();
11308 data << uint32(healInfo.GetSpellInfo()->Id);
11309 data << uint32(healInfo.GetHeal());
11310 data << uint32(overheal);
11311 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11312 data << uint8(critical ? 1 : 0);
11313 data << uint8(0); // unused
11314 SendMessageToSet(&data, true);
11315}
@ SMSG_SPELLHEALLOG
Definition Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3099{
3100 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3101 data << GetGUID();
3102 data << victim->GetGUID();
3103 if (sendTo)
3104 sendTo->SendDirectMessage(&data);
3105 else
3106 SendMessageToSet(&data, true);
3107 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3108}
@ SMSG_ATTACKSTART
Definition Opcodes.h:353

References Object::GetGUID(), Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3115{
3116 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3117 // pussywizard: this happens in some boss scripts, just add clearing here
3118 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3119
3120 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3121 data << GetPackGUID();
3122
3123 if (victim)
3124 {
3125 data << victim->GetPackGUID();
3126 data << (uint32)victim->isDead();
3127 }
3128 SendMessageToSet(&data, true);
3129 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3130
3131 if (victim)
3132 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3133 else
3134 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3135}
bool isDead() const
Definition Unit.h:1750
@ SMSG_ATTACKSTOP
Definition Opcodes.h:354

References Object::GetGUID(), Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, and ObjectGuid::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
539{
540 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
541 data << GetPackGUID();
542
543 data << uint8(0); // new in 3.1
544 data << GetPositionX() << GetPositionY() << GetPositionZ();
545 data << GameTime::GetGameTimeMS().count();
546 data << uint8(0);
547 data << uint32(sf);
548 data << TransitTime; // Time in between points
549 data << uint32(1); // 1 single waypoint
550 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
551
552 SendMessageToSet(&data, true);
553}
@ SMSG_MONSTER_MOVE
Definition Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20568{
20569 if (!movespline->Initialized())
20570 return;
20572 data << GetPackGUID();
20573 sendTo->SendDirectMessage(&data);
20574}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16711{
16712 if (IsRooted())
16713 {
16714 // each case where this occurs has to be examined and reported and dealt with.
16715 LOG_ERROR("Unit", "Attempted sending heartbeat with root flag for guid {}", GetGUID().ToString());
16716 return;
16717 }
16718
16719 WorldPacket data;
16720 BuildHeartBeatMsg(&data);
16721 SendMessageToSet(&data, self);
16722}
bool IsRooted() const
Definition Unit.h:1670
void BuildHeartBeatMsg(WorldPacket *data) const
Definition Object.cpp:2083

References BuildHeartBeatMsg(), Object::GetGUID(), IsRooted(), LOG_ERROR, WorldObject::SendMessageToSet(), and Position::ToString().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_volkhan::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), Player::UpdateCharmedAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20577{
20578 if (!movespline->Initialized())
20579 return;
20581 data << GetPackGUID();
20582 sendTo->SendDirectMessage(&data);
20583}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20559{
20560 if (!movespline->Initialized())
20561 return;
20563 data << GetPackGUID();
20564 sendTo->SendDirectMessage(&data);
20565}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendMoveRoot()

void Unit::SendMoveRoot ( bool  state)
protected
18261{
18262 const Player* client = GetClientControlling();
18263
18264 // Apply flags in-place when unit currently is not controlled by a player
18265 if (!client)
18266 {
18267 if (apply)
18268 {
18271 if (!client)
18272 StopMoving();
18273 }
18274 else
18276 }
18277
18278 if (!IsInWorld())
18279 return;
18280
18281 const PackedGuid& guid = GetPackGUID();
18282 // Wrath+ spline root: when unit is currently not controlled by a player
18283 if (!client)
18284 {
18285 WorldPacket data(apply ? SMSG_SPLINE_MOVE_ROOT : SMSG_SPLINE_MOVE_UNROOT, guid.size());
18286 data << guid;
18287 SendMessageToSet(&data, true);
18288 }
18289 // Wrath+ force root: when unit is controlled by a player
18290 else
18291 {
18292 uint32 const counter = client->GetSession()->GetOrderCounter();
18293
18294 WorldPacket data(apply ? SMSG_FORCE_MOVE_ROOT : SMSG_FORCE_MOVE_UNROOT, guid.size() + 4);
18295 data << guid;
18296 data << counter;
18297 client->GetSession()->SendPacket(&data);
18298 client->GetSession()->IncrementOrderCounter();
18299 }
18300}
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition UnitDefines.h:410
Player const * GetClientControlling() const
Definition Unit.cpp:21252
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:252
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition Opcodes.h:824
void AddMovementFlag(uint32 flag)
Definition Object.h:344

References MovementInfo::AddMovementFlag(), GetClientControlling(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetSession(), WorldSession::IncrementOrderCounter(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_MASK_MOVING_FLY, MOVEMENTFLAG_ROOT, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), WorldSession::SendPacket(), PackedGuid::size(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, and StopMoving().

Referenced by Player::BuildPlayerRepop(), Player::KillPlayer(), Player::ResurrectPlayer(), and SetRooted().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6489{
6490 AuraEffect const* aura = pInfo->auraEff;
6492 data << GetPackGUID();
6493 data << aura->GetCasterGUID().WriteAsPacked();
6494 data << uint32(aura->GetId()); // spellId
6495 data << uint32(1); // count
6496 data << uint32(aura->GetAuraType()); // auraId
6497 switch (aura->GetAuraType())
6498 {
6501 {
6502 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6503 uint32 damage = pInfo->damage;
6504 uint32 absorb = pInfo->absorb;
6505 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6506 {
6507 absorb = damage;
6508 damage = 0;
6509 }
6510
6511 data << uint32(damage); // damage
6512 data << uint32(pInfo->overDamage); // overkill?
6513 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6514 data << uint32(absorb); // absorb
6515 data << uint32(pInfo->resist); // resist
6516 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6517 }
6518 break;
6521 data << uint32(pInfo->damage); // damage
6522 data << uint32(pInfo->overDamage); // overheal
6523 data << uint32(pInfo->absorb); // absorb
6524 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6525 break;
6528 data << uint32(aura->GetMiscValue()); // power type
6529 data << uint32(pInfo->damage); // damage
6530 break;
6532 data << uint32(aura->GetMiscValue()); // power type
6533 data << uint32(pInfo->damage); // amount
6534 data << float(pInfo->multiplier); // gain multiplier
6535 break;
6536 default:
6537 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6538 return;
6539 }
6540
6541 SendMessageToSet(&data, true);
6542}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition Opcodes.h:620
float multiplier
Definition Unit.h:523
bool critical
Definition Unit.h:524
uint32 overDamage
Definition Unit.h:520
uint32 resist
Definition Unit.h:522
uint32 damage
Definition Unit.h:519
AuraEffect const * auraEff
Definition Unit.h:518
uint32 absorb
Definition Unit.h:521

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg) const

-------—Pet responses methods--------------—

16616{
16617 Unit* owner = GetOwner();
16618 if (!owner || !owner->IsPlayer())
16619 return;
16620
16622 data << uint8(msg);
16623 owner->ToPlayer()->SendDirectMessage(&data);
16624}
@ SMSG_PET_ACTION_FEEDBACK
Definition Opcodes.h:740

References GetOwner(), Object::IsPlayer(), Player::SendDirectMessage(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetActionSound()

void Unit::SendPetActionSound ( PetAction  action) const
16627{
16628 SendMessageToSet(WorldPackets::Pet::PetActionSound(GetGUID(), static_cast<int32>(action)).Write(), false);
16629}
Definition PetPackets.h:100

References Object::GetGUID(), and WorldObject::SendMessageToSet().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid) const
16638{
16639 Unit* owner = GetOwner();
16640 if (!owner || !owner->IsPlayer())
16641 return;
16642
16643 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16644 data << guid;
16645 data << uint32(AI_REACTION_HOSTILE);
16646 owner->ToPlayer()->SendDirectMessage(&data);
16647}
@ SMSG_AI_REACTION
Definition Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Object::IsPlayer(), Player::SendDirectMessage(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetDismissSound()

void Unit::SendPetDismissSound ( ) const
16632{
16633 if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()))
16634 SendMessageToSet(WorldPackets::Pet::PetDismissSound(static_cast<int32>(displayInfo->ModelId), GetPosition()).Write(), false);
16635}
Definition PetPackets.h:112
Position GetPosition() const
Definition Position.h:147

References GetNativeDisplayId(), Position::GetPosition(), sCreatureDisplayInfoStore, and WorldObject::SendMessageToSet().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
18947{
18949 data << guid; // target
18950 data << uint32(id); // SpellVisualKit.dbc index
18951 SendMessageToSet(&data, true);
18952}
@ SMSG_PLAY_SPELL_IMPACT
Definition Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
19889{
19890 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
19891 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
19892 data << GetPackGUID();
19893 data << pHostileReference->getUnitGuid().WriteAsPacked();
19894 SendMessageToSet(&data, false);
19895}
@ SMSG_THREAT_REMOVE
Definition Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6569{
6570 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6571 data << GetGUID();
6572 data << target->GetGUID();
6573 data << uint32(spellId);
6574 data << uint8(0); // bool - log format: 0-default, 1-debug
6575 SendMessageToSet(&data, true);
6576}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition Opcodes.h:641

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealDamageShieldDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6559{
6560 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6561 data << GetGUID();
6562 data << target->GetGUID();
6563 data << uint32(spellId);
6564 data << uint8(0); // bool - log format: 0-default, 1-debug
6565 SendMessageToSet(&data, true);
6566}
@ SMSG_PROCRESIST
Definition Opcodes.h:638

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6545{
6546 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6547 data << uint32(spellID);
6548 data << GetGUID();
6549 data << uint8(0); // can be 0 or 1
6550 data << uint32(1); // target count
6551 // for (i = 0; i < target count; ++i)
6552 data << target->GetGUID(); // target GUID
6553 data << uint8(missInfo);
6554 // end loop
6555 SendMessageToSet(&data, true);
6556}
@ SMSG_SPELLLOGMISS
Definition Opcodes.h:617

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealDamageShieldDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6410{
6411 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6412 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6413 uint32 damage = log->damage;
6414 uint32 absorb = log->absorb;
6415 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6416 {
6417 absorb = damage;
6418 damage = 0;
6419 }
6420 data << log->target->GetPackGUID();
6421 data << log->attacker->GetPackGUID();
6422 data << uint32(log->spellInfo->Id);
6423 data << uint32(damage); // damage amount
6424 int32 overkill = damage - log->target->GetHealth();
6425 data << uint32(overkill > 0 ? overkill : 0); // overkill
6426 data << uint8 (log->schoolMask); // damage school
6427 data << uint32(absorb); // AbsorbedDamage
6428 data << uint32(log->resist); // resist
6429 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6430 data << uint8 (log->unused); // unused
6431 data << uint32(log->blocked); // blocked
6432 data << uint32(log->HitInfo);
6433 data << uint32(log->HitInfo);
6435 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6436 //{
6437 // data << float(log->CritRoll);
6438 // data << float(log->CritNeeded);
6439 //}
6440 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6441 //{
6442 // data << float(log->HitRoll);
6443 // data << float(log->HitNeeded);
6444 //}
6445 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6446 //{
6447 // data << float(log->MissChance);
6448 // data << float(log->DodgeChance);
6449 // data << float(log->ParryChance);
6450 // data << float(log->BlockChance);
6451 // data << float(log->GlanceChance);
6452 // data << float(log->CrushChance);
6453 //}
6454 SendMessageToSet(&data, true);
6455}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition SharedDefines.h:1548
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition SharedDefines.h:1551
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition SharedDefines.h:1546
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition Opcodes.h:622
bool physicalLog
Definition Unit.h:505
bool unused
Definition Unit.h:506

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6458{
6459 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6460 log.damage = Damage;
6461 log.absorb = AbsorbedDamage;
6462 log.resist = Resist;
6463 log.physicalLog = PhysicalDamage;
6464 log.blocked = Blocked;
6465 log.HitInfo = 0;
6466 if (CriticalHit)
6467 {
6468 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6469 }
6470 if (Split)
6471 {
6472 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6473 }
6475}
@ SPELL_HIT_TYPE_SPLIT
Definition SharedDefines.h:1549
Definition Unit.h:491

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6378{
6379 // Xinef: function for players only, placed in unit because of cosmetics
6380 if (!IsPlayer())
6381 return;
6382
6383 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6384 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6385 uint32 damage = log->damage;
6386 uint32 absorb = log->absorb;
6387 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6388 {
6389 absorb = damage;
6390 damage = 0;
6391 }
6392 data << log->target->GetPackGUID();
6393 data << attacker->GetPackGUID();
6394 data << uint32(log->spellInfo->Id);
6395 data << uint32(damage); // damage amount
6396 int32 overkill = damage - log->target->GetHealth();
6397 data << uint32(overkill > 0 ? overkill : 0); // overkill
6398 data << uint8 (log->schoolMask); // damage school
6399 data << uint32(absorb); // AbsorbedDamage
6400 data << uint32(log->resist); // resist
6401 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6402 data << uint8 (log->unused); // unused
6403 data << uint32(log->blocked); // blocked
6404 data << uint32(log->HitInfo);
6405 data << uint8 (0); // flag to use extend data
6406 ToPlayer()->SendDirectMessage(&data);
6407}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19761{
19763 data << uint8(result);
19764 ToPlayer()->SendDirectMessage(&data);
19765}
@ SMSG_PET_TAME_FAILURE
Definition Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19768{
19770 if (IsCreature())
19771 Relocate(&pos);
19772 if (IsPlayer())
19773 {
19774 ToPlayer()->SetCanTeleport(true);
19775 }
19776 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
19777 data2 << GetPackGUID();
19778 BuildMovementPacket(&data2);
19779 if (IsCreature())
19780 Relocate(&oldPos);
19781 if (IsPlayer())
19782 Relocate(&pos);
19783 SendMessageToSet(&data2, false);
19784}
@ MSG_MOVE_TELEPORT
Definition Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
19840{
19841 if (!GetThreatMgr().isThreatListEmpty())
19842 {
19843 uint32 count = GetThreatMgr().GetThreatList().size();
19844
19845 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
19846 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
19847 data << GetPackGUID();
19848 data << uint32(count);
19850 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19851 {
19852 data << (*itr)->getUnitGuid().WriteAsPacked();
19853 data << uint32((*itr)->GetThreat() * 100);
19854 }
19855 SendMessageToSet(&data, false);
19856 }
19857}
@ SMSG_THREAT_UPDATE
Definition Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
679{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
18930{
18931 Aura* aura = target->GetAura(spellId, GetGUID());
18932 if (!aura)
18933 aura = AddAura(spellId, target);
18934 if (aura && stack)
18935 aura->SetStackAmount(stack);
18936}
void SetStackAmount(uint8 num)
Definition SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1178{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

void Unit::SetCanFly ( bool  enable)

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

20394{
20395 bool isClientControlled = IsClientControlled();
20396
20397 if (!isClientControlled)
20398 {
20399 if (enable)
20401 else
20403 }
20404
20405 if (!IsInWorld()) // is sent on add to map
20406 return;
20407
20408 if (isClientControlled)
20409 {
20410 if (Player const* player = GetClientControlling())
20411 {
20412 uint32 const counter = player->GetSession()->GetOrderCounter();
20413 const_cast<Player*>(player)->SetPendingFlightChange(counter);
20414
20416 data << GetPackGUID();
20417 data << counter;
20418 player->SendDirectMessage(&data);
20419 player->GetSession()->IncrementOrderCounter();
20420 return;
20421 }
20422 }
20423
20425 data << GetPackGUID();
20426 SendMessageToSet(&data, true);
20427}
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:393
@ SMSG_SPLINE_MOVE_SET_FLYING
Definition Opcodes.h:1088
@ SMSG_MOVE_SET_CAN_FLY
Definition Opcodes.h:865
@ SMSG_SPLINE_MOVE_UNSET_FLYING
Definition Opcodes.h:1089
@ SMSG_MOVE_UNSET_CAN_FLY
Definition Opcodes.h:866

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_CAN_FLY, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_SET_CAN_FLY, SMSG_MOVE_UNSET_CAN_FLY, SMSG_SPLINE_MOVE_SET_FLYING, and SMSG_SPLINE_MOVE_UNSET_FLYING.

Referenced by boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_kalecgos_kj::DoAction(), boss_nightbane::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), gm_commandscript::HandleGMFlyCommand(), WorldSession::HandleMoveKnockBackAck(), boss_felmyst::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_urom::boss_uromAI::JustDied(), boss_sartharion_dragonAI::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), npc_icc_spire_frostwyrm::JustReachedHome(), brann_bronzebeard::brann_bronzebeardAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_kiljaeden::JustSummoned(), boss_onyxia::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_spire_frostwyrm::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_pet_dk_ebon_gargoyle::MovementInform(), npc_alexstrasza::npc_alexstraszaAI::npc_alexstraszaAI(), npc_batrider::npc_batrider(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_pet_gen_moth::npc_pet_gen_moth(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), npc_hallows_end_soh::Reset(), boss_onyxia::Reset(), boss_ayamiss::Reset(), boss_sartharion_dragonAI::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_icc_spire_frostwyrm::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), boss_nazan::Reset(), boss_felmyst::ScheduleGroundAbilities(), npc_enslaved_proto_drake::SetData(), SmartAI::SetFly(), npc_simon_bunny::npc_simon_bunnyAI::SetGUID(), boss_urom::boss_uromAI::SpellHit(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_batrider::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17309{
17310 if (apply)
17311 ++m_procDeep;
17312 else
17313 {
17315 --m_procDeep;
17316 }
17317}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10953{
10954 if (apply)
10955 {
10956 if (IsPlayer())
10957 {
10958 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10959 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10960
10961 charm->m_ControlledByPlayer = true;
10963 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10964 }
10965 else
10966 charm->m_ControlledByPlayer = false;
10967
10968 // PvP, FFAPvP
10969 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10970
10971 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10972 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10973
10974 _isWalkingBeforeCharm = charm->IsWalking();
10976 {
10977 charm->SetWalk(false);
10978 charm->SendMovementFlagUpdate();
10979 }
10980
10981 m_Controlled.insert(charm);
10982 }
10983 else
10984 {
10985 if (IsPlayer())
10986 {
10987 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10988 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10989 }
10990
10991 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10992 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10993
10994 if (charm->IsPlayer())
10995 {
10996 charm->m_ControlledByPlayer = true;
10997 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10998 charm->ToPlayer()->UpdatePvPState();
10999 }
11000 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
11001 {
11002 charm->m_ControlledByPlayer = true;
11003 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11004 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
11005
11006 // Xinef: skip controlled erase if charmed unit is owned by charmer
11007 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
11008 return;
11009 }
11010 else
11011 {
11012 charm->m_ControlledByPlayer = false;
11013 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11014 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
11015 }
11016
11017 if (charm->IsWalking() != _isWalkingBeforeCharm)
11018 {
11019 charm->SetWalk(_isWalkingBeforeCharm);
11020 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
11021 }
11022
11023 m_Controlled.erase(charm);
11024 }
11025}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:675
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:693

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18378{
18379 if (!charmer)
18380 return false;
18381
18382 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18383 {
18384 return false;
18385 }
18386
18387 // dismount players when charmed
18388 if (IsPlayer())
18390
18391 if (charmer->IsPlayer())
18393
18394 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18395 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18396 throw 1;
18397 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18398
18399 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18400 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18401
18402 if (this == charmer)
18403 {
18404 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18405 return false;
18406 }
18407
18408 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18409 // return false;
18410
18411 if (IsPlayer() && ToPlayer()->GetTransport())
18412 {
18413 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18414 return false;
18415 }
18416
18417 // Already charmed
18418 if (GetCharmerGUID())
18419 {
18420 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18421 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18422 return false;
18423 }
18424
18425 CastStop();
18426 AttackStop();
18427
18428 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18429 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18430 // DeleteThreatList();
18431
18432 Player* playerCharmer = charmer->ToPlayer();
18433
18434 // Charmer stop charming
18435 if (playerCharmer)
18436 {
18437 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18438 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18439 }
18440
18441 // Charmed stop charming
18442 if (IsPlayer())
18443 {
18444 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18445 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18446 }
18447
18448 // StopCastingCharm may remove a possessed pet?
18449 if (!IsInWorld())
18450 {
18451 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18452 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18453 return false;
18454 }
18455
18456 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18457 // prevent undefined behaviour
18458 if (aurApp && aurApp->GetRemoveMode())
18459 return false;
18460
18462 SetFaction(charmer->GetFaction());
18463
18464 // Set charmed
18465 charmer->SetCharm(this, true);
18466
18468
18469 if (IsCreature())
18470 {
18471 GetMotionMaster()->Clear(false);
18473 StopMoving();
18474
18475 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18476 {
18477 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18478 Creature* charmed = ToCreature();
18479 charmed->NeedChangeAI = true;
18480 charmed->IsAIEnabled = false;
18481 }
18482 else
18483 {
18484 ToCreature()->AI()->OnCharmed(true);
18485 }
18486
18487 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18488 if (charmer->IsPlayer() && ToCreature()->CanFly())
18490 }
18491 else
18492 {
18493 Player* player = ToPlayer();
18494 if (player->isAFK())
18495 player->ToggleAFK();
18496
18497 player->SetClientControl(this, false); // verified
18498 }
18499
18500 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18501 // prevent undefined behaviour
18502 if (aurApp && aurApp->GetRemoveMode())
18503 return false;
18504
18505 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18506 // Xinef: I need charmInfo for vehicle
18507 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18508 {
18509 InitCharmInfo();
18510 if (type == CHARM_TYPE_POSSESS)
18512 else if (type != CHARM_TYPE_VEHICLE)
18513 {
18515
18516 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18517 if (type == CHARM_TYPE_CONVERT && IsCreature())
18519 }
18520 }
18521
18522 if (playerCharmer)
18523 {
18524 switch (type)
18525 {
18526 case CHARM_TYPE_VEHICLE:
18529 playerCharmer->SetClientControl(this, true); // verified
18530 playerCharmer->VehicleSpellInitialize();
18531 break;
18532 case CHARM_TYPE_POSSESS:
18537 playerCharmer->SetClientControl(this, true); // verified
18538 playerCharmer->PossessSpellInitialize();
18539 break;
18540 case CHARM_TYPE_CHARM:
18542 {
18544 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18545 {
18546 // to prevent client crash
18548
18549 // just to enable stat window
18550 if (GetCharmInfo())
18551 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18552
18553 // if charmed two demons the same session, the 2nd gets the 1st one's name
18554 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18555 }
18556 }
18557 if (playerCharmer->m_seer != this)
18558 {
18560 playerCharmer->CharmSpellInitialize();
18561 }
18562 break;
18563 default:
18564 break;
18565 }
18566 }
18567 else if (IsPlayer())
18569
18570 if (Creature* creature = ToCreature())
18571 creature->RefreshSwimmingFlag();
18572
18573 if (IsPlayer())
18574 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18575
18576 return true;
18577}
@ CHARM_TYPE_CONVERT
Definition CharmInfo.h:48
@ REACT_DEFENSIVE
Definition Unit.h:551
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition CreatureAI.cpp:36
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:99
void MoveIdle()
Definition MotionMaster.cpp:233
void CharmSpellInitialize()
Definition Player.cpp:9727
WorldObject * m_seer
Definition Player.h:2338
void ToggleAFK()
Definition Player.cpp:1308
void PossessSpellInitialize()
Definition Player.cpp:9624
bool isAFK() const
Definition Player.h:1136
void VehicleSpellInitialize()
Definition Player.cpp:9652
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13203
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:757
virtual float GetFollowAngle() const
Definition Unit.h:1850
CharmInfo * InitCharmInfo()
Definition Unit.cpp:15822
void InitPossessCreateSpells()
Definition CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition CharmInfo.cpp:98

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
928{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18346{
18347 if (apply)
18348 {
18349 SetTarget();
18351 }
18352 else
18353 {
18354 if (IsAlive())
18355 {
18356 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18357 {
18359 StopMoving();
18360 }
18361
18362 if (GetVictim())
18364 }
18365 }
18366
18367 // xinef: block / allow control to real mover (eg. charmer)
18368 if (IsPlayer())
18369 {
18370 if (m_movedByPlayer)
18371 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18372 //else
18373 // ToPlayer()->SetClientControl(this, !apply);
18374 }
18375}
@ CONFUSED_MOTION_TYPE
Definition MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:293

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17271{
17273
17274 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17275 return;
17276
17277 // check if there any guards that should care about the contested flag on player
17278 if (lookForNearContestedGuards)
17279 {
17280 std::list<Unit*> targets;
17283 Cell::VisitObjects(this, searcher, MAX_AGGRO_RADIUS);
17284
17285 // return if there are no contested guards found
17286 if (!targets.size())
17287 {
17288 return;
17289 }
17290 }
17291
17292 player->SetContestedPvPTimer(30000);
17294 {
17297 // call MoveInLineOfSight for nearby contested guards
17299 }
17301 {
17303 // call MoveInLineOfSight for nearby contested guards
17305 }
17306}
#define MAX_AGGRO_RADIUS
Definition Unit.h:45
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1111
bool InBattleground() const
Definition Player.h:2256
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1864

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18071{
18072 if (apply)
18073 {
18074 if (HasUnitState(state))
18075 return;
18076
18077 AddUnitState(state);
18078 switch (state)
18079 {
18080 case UNIT_STATE_STUNNED:
18081 SetStunned(true);
18082 break;
18083 case UNIT_STATE_ROOT:
18085 SetRooted(true);
18086 break;
18089 {
18092 // SendAutoRepeatCancel ?
18093 SetConfused(true);
18094 CastStop(0, false);
18095 }
18096 break;
18097 case UNIT_STATE_FLEEING:
18099 {
18102 // SendAutoRepeatCancel ?
18103 SetFeared(true, source, isFear);
18104 CastStop(0, false);
18105 }
18106 break;
18107 default:
18108 break;
18109 }
18110
18111 if (IsPlayer())
18112 {
18113 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18114 }
18115 }
18116 else
18117 {
18118 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18119 // xinef: added to each case because of return
18120 //ClearUnitState(state);
18121
18122 switch (state)
18123 {
18124 case UNIT_STATE_STUNNED:
18125 if (HasStunAura())
18126 return;
18127 ClearUnitState(state);
18128 SetStunned(false);
18129 break;
18130 case UNIT_STATE_ROOT:
18131 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18132 if (IsCreature())
18133 {
18134 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18135 {
18136 return;
18137 }
18138 }
18139
18140 if (HasRootAura() || GetVehicle())
18141 return;
18142 ClearUnitState(state);
18143 SetRooted(false);
18144 break;
18146 if (HasConfuseAura())
18147 return;
18148 ClearUnitState(state);
18149 SetConfused(false);
18150 break;
18151 case UNIT_STATE_FLEEING:
18152 if (HasFearAura())
18153 return;
18154 ClearUnitState(state);
18155 SetFeared(false);
18156 break;
18157 default:
18158 return;
18159 }
18160
18161 //ClearUnitState(state);
18162
18164 SetStunned(true);
18165 else
18166 {
18168 SetRooted(true);
18169
18171 SetConfused(true);
18173 {
18174 bool isFear = false;
18175 if (HasFearAura())
18176 {
18177 isFear = true;
18178 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18179 }
18180
18181 if (!source)
18182 {
18183 source = getAttackerForHelper();
18184 }
18185
18186 SetFeared(true, source, isFear);
18187 }
18188 }
18189 }
18190}
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition Unit.cpp:18313
bool HasStunAura() const
Definition Unit.h:1794
void SetConfused(bool apply)
Definition Unit.cpp:18345
void SetStunned(bool apply)
Definition Unit.cpp:18192
Unit * getAttackerForHelper() const
Definition Unit.cpp:754
bool HasConfuseAura() const
Definition Unit.h:1792
void SetRooted(bool apply, bool stun=false, bool logout=false)
Definition Unit.cpp:18240
bool HasRootAura() const
Definition Unit.h:1793
bool HasFearAura() const
Definition Unit.h:1791
Definition Unit.h:259

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
4014{
4015 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
4016
4017 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
4018
4019 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
4020 return;
4021
4022 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4023
4024 // break same type spell if it is not delayed
4025 InterruptSpell(CSpellType, false, true, bySelf);
4026
4027 // special breakage effects:
4028 switch (CSpellType)
4029 {
4031 {
4032 // generic spells always break channeled not delayed spells
4034 {
4035 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4036 {
4038 }
4039 }
4040
4041 // autorepeat breaking
4043 {
4044 // break autorepeat if not Auto Shot
4045 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4047 m_AutoRepeatFirstCast = true;
4048 }
4049
4050 // melee spells breaking
4052 {
4053 // break melee spells if cast time
4054 if (pSpell->GetCastTime() > 0)
4055 {
4057 }
4058 }
4059 if (pSpell->GetCastTime() > 0)
4061
4062 break;
4063 }
4065 {
4066 // channel spells always break generic non-delayed and any channeled spells
4068 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4069
4070 // it also does break autorepeat if not Auto Shot
4072 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4075
4076 break;
4077 }
4079 {
4080 // only Auto Shoot does not break anything
4081 if (pSpell->m_spellInfo->Id != 75)
4082 {
4083 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4085 {
4086 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4087 {
4089 }
4090 }
4091
4093 }
4094 // special action: set first cast flag
4095 m_AutoRepeatFirstCast = true;
4096
4097 break;
4098 }
4099
4100 default:
4101 // other spell types don't break anything now
4102 break;
4103 }
4104
4105 // current spell (if it is still here) may be safely deleted now
4106 if (m_currentSpells[CSpellType])
4107 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4108
4109 // set new current spell
4110 m_currentSpells[CSpellType] = pSpell;
4111 pSpell->SetReferencedFromCurrent(true);
4112
4113 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4114}
CurrentSpellTypes GetCurrentContainer() const
Definition Spell.cpp:7865
Spell ** m_selfContainer
Definition Spell.h:622

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14579{
14580 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14581 // it can be used to check creation of death items (such as soul shards).
14582 m_deathState = s;
14583
14585 {
14586 CombatStop();
14589 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14590
14591 if (IsNonMeleeSpellCast(false))
14593
14594 UnsummonAllTotems(true);
14595 RemoveAllControlled(true);
14597 }
14598
14599 if (s == DeathState::JustDied)
14600 {
14601 // remove aurastates allowing special moves
14604
14605 GetMotionMaster()->Clear(false);
14607
14608 // Xinef: Remove Hover so the corpse can fall to the ground
14609 SetHover(false);
14610
14611 if (despawn)
14612 DisableSpline();
14613 else
14614 StopMoving();
14615
14616 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14617 // do not why since in IncreaseMaxHealth currenthealth is checked
14618 SetHealth(0);
14619 SetPower(getPowerType(), 0);
14620
14621 // Stop emote on death
14623
14624 // players in instance don't have ZoneScript, but they have InstanceScript
14626 zoneScript->OnUnitDeath(this);
14627 }
14628 else if (s == DeathState::JustRespawned)
14629 {
14630 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14631 }
14632}
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:280
void SetHover(bool enable)
Definition Unit.cpp:20470
void ClearAllReactives()
Definition Unit.cpp:16949
void ClearDiminishings()
Definition Unit.h:1817
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1221
ZoneScript * GetZoneScript() const
Definition Object.h:627
Definition ZoneScript.h:26

References Alive, MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), JustDied, JustRespawned, m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

void Unit::SetDisableGravity ( bool  disable)
20334{
20335 bool isClientControlled = IsClientControlled();
20336
20337 if (!isClientControlled)
20338 {
20339 if (enable)
20341 else
20343 }
20344
20345 if (!IsInWorld()) // is sent on add to map
20346 return;
20347
20348 if (isClientControlled)
20349 {
20350 if (Player const* player = GetClientControlling())
20351 {
20352 uint32 const counter = player->GetSession()->GetOrderCounter();
20353
20355 data << GetPackGUID();
20356 data << counter;
20357 player->GetSession()->SendPacket(&data);
20358 player->GetSession()->IncrementOrderCounter();
20359 return;
20360 }
20361 }
20362
20364 data << GetPackGUID();
20365 SendMessageToSet(&data, true);
20366}
@ SMSG_SPLINE_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1265
@ SMSG_MOVE_GRAVITY_DISABLE
Definition Opcodes.h:1260
@ SMSG_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1262
@ SMSG_SPLINE_MOVE_GRAVITY_ENABLE
Definition Opcodes.h:1266

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_DISABLE_GRAVITY, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_ENABLE, SMSG_SPLINE_MOVE_GRAVITY_DISABLE, and SMSG_SPLINE_MOVE_GRAVITY_ENABLE.

Referenced by boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::boss_yoggsaron_brainAI(), boss_the_lurker_below::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_nightbane::DoAction(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_taldaram::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_madrigosa::DoAction(), boss_kalecgos::DoAction(), npc_kalecgos_kj::DoAction(), boss_illidan_stormrage::DoAction(), boss_nightbane::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_the_lich_king_valkyr_target_search::HandleScript(), boss_felmyst::InitializeAI(), boss_taldaram::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), boss_malygos::boss_malygosAI::InitializeAI(), boss_razorscale::boss_razorscaleAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_kologarn::boss_kologarnAI::JustDied(), boss_ayamiss::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_saviana_ragefire::boss_saviana_ragefireAI::JustReachedHome(), npc_spinestalker::npc_spinestalkerAI::JustReachedHome(), npc_rimefang::npc_rimefangAI::JustReachedHome(), npc_icc_spire_frostwyrm::JustReachedHome(), boss_ingvar_the_plunderer::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_enslaved_netherwing_drake::MovementInform(), boss_onyxia::MovementInform(), boss_ayamiss::MovementInform(), boss_taldaram::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_spire_frostwyrm::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), npc_oculus_drake::npc_oculus_drakeAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), npc_hallows_end_soh::MovementInform(), boss_headless_horseman::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_kaelthas::MovementInform(), npc_pet_dk_ebon_gargoyle::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_alexstrasza::npc_alexstraszaAI::npc_alexstraszaAI(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_gothik_trigger::npc_gothik_triggerAI::npc_gothik_triggerAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::npc_icc_nerubar_broodkeeperAI(), npc_korkron_or_wildhammer::npc_korkron_or_wildhammer(), npc_nightbane_helper_target::npc_nightbane_helper_target(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::npc_ulduar_aerial_command_unitAI(), spell_chapter5_light_of_dawn_aura::OnApply(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_chapter5_light_of_dawn_aura::OnRemove(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_jeklik::PathEndReached(), boss_nefarian::PathEndReached(), SmartScript::ProcessAction(), boss_nefarian::Reset(), boss_kalecgos::Reset(), npc_akilzon_eagle::Reset(), boss_jeklik::Reset(), npc_soh_fire_trigger::Reset(), npc_hallows_end_soh::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_ayamiss::Reset(), boss_jedoga_shadowseeker::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), npc_spinestalker::npc_spinestalkerAI::Reset(), npc_rimefang::npc_rimefangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_icc_spire_frostwyrm::Reset(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), boss_illidan_stormrage::Reset(), boss_nazan::Reset(), boss_kaelthas::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), npc_enslaved_proto_drake::SetData(), Creature::setDeathState(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_onyxia::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetDisplayId()

◆ SetDualWieldMode()

virtual void Unit::SetDualWieldMode ( DualWieldMode  mode)
inlinevirtual
958{ _dualWieldMode = mode; }

References _dualWieldMode.

Referenced by Creature::InitEntry(), and Creature::UpdateEntry().

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20283{
20284 Movement::MoveSplineInit init(this);
20285 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20287 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20288 init.SetFacing(ori);
20289 init.Launch();
20290}
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18783

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object,
Milliseconds  timed = 0ms 
)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20293{
20294 // never face when already moving
20295 if (!IsStopped())
20296 return;
20297
20299 Movement::MoveSplineInit init(this);
20300 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20301 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20302 init.Launch();
20303
20304 if (timed > 0ms)
20305 {
20306 if (Creature* c = ToCreature())
20307 {
20308 c->m_Events.AddEventAtOffset([c]()
20309 {
20310 if (c->IsInWorld() && c->FindMap() && c->IsAlive() && !c->IsInCombat())
20311 c->SetFacingTo(c->GetHomePosition().GetOrientation());
20312 }, timed);
20313 }
20314 else
20315 LOG_ERROR("entities.unit", "Unit::SetFacingToObject called on non-creature unit {}. This should never happen.", GetEntry());
20316 }
20317}
bool IsStopped() const
Definition Unit.h:1717

References Position::GetAngle(), Object::GetEntry(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), LOG_ERROR, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Object::ToCreature().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), Spell::EffectSummonType(), spell_chapter5_return_to_capital::HandleHit(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_acherus_necromancer::npc_acherus_necromancerAI::MovementInform(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10108{
10110 if (IsCreature())
10112}
void UpdateMoveInLineOfSightState()
Definition Creature.cpp:2598

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kalecgos::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), InstanceScript::OnPlayerEnter(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), npc_deathstalker_fearleia::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18314{
18315 if (apply)
18316 {
18317 SetTarget();
18318 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18319 }
18320 else
18321 {
18322 if (IsAlive())
18323 {
18324 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18325 {
18327 StopMoving();
18328 }
18329
18330 if (GetVictim())
18332 }
18333 }
18334
18335 // xinef: block / allow control to real mover (eg. charmer)
18336 if (IsPlayer())
18337 {
18338 if (m_movedByPlayer)
18339 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18340 //else
18341 // ToPlayer()->SetClientControl(this, !apply);
18342 }
18343}
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition WorldConfig.h:237
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:795

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

void Unit::SetFeatherFall ( bool  enable)
20430{
20431 bool isClientControlled = IsClientControlled();
20432
20433 if (!isClientControlled)
20434 {
20435 if (enable)
20437 else
20439 }
20440
20441 if (!IsInWorld()) // is sent on add to map
20442 return;
20443
20444 if (isClientControlled)
20445 {
20446 if (Player const* player = GetClientControlling())
20447 {
20448 uint32 const counter = player->GetSession()->GetOrderCounter();
20449
20451
20452 data << GetPackGUID();
20453 data << counter;
20454 player->SendDirectMessage(&data);
20455 player->GetSession()->IncrementOrderCounter();
20456
20457 // start fall from current height
20458 if (!enable)
20459 const_cast<Player*>(player)->SetFallInformation(0, GetPositionZ());
20460
20461 return;
20462 }
20463 }
20464
20466 data << GetPackGUID();
20467 SendMessageToSet(&data, true);
20468}
@ MOVEMENTFLAG_FALLING_SLOW
Definition UnitDefines.h:398
@ SMSG_MOVE_FEATHER_FALL
Definition Opcodes.h:272
@ SMSG_MOVE_NORMAL_FALL
Definition Opcodes.h:273
@ SMSG_SPLINE_MOVE_NORMAL_FALL
Definition Opcodes.h:804

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), Position::GetPositionZ(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING_SLOW, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_FEATHER_FALL, SMSG_MOVE_NORMAL_FALL, SMSG_SPLINE_MOVE_FEATHER_FALL, and SMSG_SPLINE_MOVE_NORMAL_FALL.

Referenced by AuraEffect::HandleAuraFeatherFall(), and debug_commandscript::HandleDebugMoveflagsCommand().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15504{
15506 val = 0;
15507 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15508 val = 1;
15509 else
15510 {
15511 uint32 maxHealth = GetMaxHealth();
15512 if (maxHealth < val)
15513 val = maxHealth;
15514 }
15515
15516 float prevHealthPct = GetHealthPct();
15517
15519
15520 // mobs that are now or were below 30% need to update their speed
15521 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15522 {
15523 UpdateSpeed(MOVE_RUN, false);
15524 }
15525
15526 // group update
15527 if (IsPlayer())
15528 {
15529 Player* player = ToPlayer();
15530 if (player->NeedSendSpectatorData())
15532
15533 if (player->GetGroup())
15535 }
15536 else if (Pet* pet = ToCreature()->ToPet())
15537 {
15538 if (pet->isControlled())
15539 {
15540 if (Unit* owner = GetOwner())
15541 if (Player* player = owner->ToPlayer())
15542 {
15543 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15544 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15545
15546 if (player->GetGroup())
15548 }
15549 }
15550 }
15551}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition Group.h:113
bool NeedSendSpectatorData() const
Definition Player.cpp:15518
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2478
float GetHealthPct() const
Definition Unit.h:1072
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62

References Dead, WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), JustDied, MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by Battleground::AddPlayer(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

void Unit::SetHover ( bool  enable)
20471{
20472 bool isClientControlled = IsClientControlled();
20473
20474 if (!isClientControlled)
20475 {
20476 if (enable)
20478 else
20480 }
20481
20482 float hoverHeight = GetHoverHeight();
20483
20484 if (enable)
20485 {
20486 if (hoverHeight && GetPositionZ() - GetMap()->GetHeight(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ()) < hoverHeight)
20487 Relocate(GetPositionX(), GetPositionY(), GetPositionZ() + hoverHeight);
20488 }
20489 else
20490 {
20491 if (IsAlive() || !IsUnit())
20492 {
20493 float newZ = std::max<float>(GetMap()->GetHeight(GetPhaseMask(), GetPositionX(), GetPositionY(), GetPositionZ()), GetPositionZ() - hoverHeight);
20496 }
20497 }
20498
20499 if (!IsInWorld()) // is sent on add to map
20500 return;
20501
20502 if (isClientControlled)
20503 {
20504 if (Player const* player = GetClientControlling())
20505 {
20507
20508 uint32 const counter = player->GetSession()->GetOrderCounter();
20509
20510 data << GetPackGUID();
20511 data << counter;
20512 player->SendDirectMessage(&data);
20513 player->GetSession()->IncrementOrderCounter();
20514 return;
20515 }
20516 }
20517
20519 data << GetPackGUID();
20520 SendMessageToSet(&data, true);
20521}
bool IsUnit() const
Definition Object.h:209
float GetHoverHeight() const
Definition Unit.h:1672
uint32 GetPhaseMask() const
Definition Object.h:513
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1587
@ SMSG_MOVE_SET_HOVER
Definition Opcodes.h:274
@ SMSG_SPLINE_MOVE_UNSET_HOVER
Definition Opcodes.h:806
@ SMSG_MOVE_UNSET_HOVER
Definition Opcodes.h:275

References MovementInfo::AddMovementFlag(), GetClientControlling(), GetHoverHeight(), WorldObject::GetMap(), Object::GetPackGUID(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsAlive(), IsClientControlled(), Object::IsInWorld(), Object::IsUnit(), WorldObject::m_movementInfo, MOVEMENTFLAG_HOVER, Position::Relocate(), MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_SET_HOVER, SMSG_MOVE_UNSET_HOVER, SMSG_SPLINE_MOVE_SET_HOVER, SMSG_SPLINE_MOVE_UNSET_HOVER, and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_taldaram::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_illidan_stormrage::DoAction(), AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_taldaram::InitializeAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_saviana_ragefire::boss_saviana_ragefireAI::JustReachedHome(), boss_taldaram::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_korkron_or_wildhammer::npc_korkron_or_wildhammer(), boss_jedoga_shadowseeker::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::Reset(), boss_svala::boss_svalaAI::Reset(), boss_illidan_stormrage::Reset(), setDeathState(), Creature::setDeathState(), boss_jedoga_shadowseeker::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), and Creature::UpdateMovementFlags().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
907{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13694

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_felblood_kaelthas::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13686{
13687 (void)keepCombat;
13688 if (apply)
13690 else
13692}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_tenris_mirkblood::EnterEvadeMode(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), boss_felmyst::InitializeAI(), boss_blackheart_the_inciter::JustEngagedWith(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_tenris_mirkblood::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_felmyst::StartIntro(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), go_blood_drenched_door::go_blood_drenched_doorAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13817{
13818 // only alive units can be in combat
13819 if (!IsAlive())
13820 return;
13821
13822 if (PvP)
13823 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13824 else if (duration)
13825 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13826
13828 return;
13829
13830 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13831 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13832 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13833
13834 if (IsInCombat())
13835 return;
13836
13838
13839 if (Creature* creature = ToCreature())
13840 {
13841 // Set home position at place of engaging combat for escorted creatures
13842 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13843 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13844 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13845 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13846
13847 if (enemy)
13848 {
13849 creature->UpdateLeashExtensionTime();
13850
13851 if (IsAIEnabled)
13852 creature->AI()->JustEngagedWith(enemy);
13853
13854 if (creature->GetFormation())
13855 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13856
13857 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13858 }
13859
13860 creature->RefreshSwimmingFlag();
13861
13862 if (IsPet())
13863 {
13864 UpdateSpeed(MOVE_RUN, true);
13865 UpdateSpeed(MOVE_SWIM, true);
13866 UpdateSpeed(MOVE_FLIGHT, true);
13867 }
13868
13869 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13870 Dismount();
13871 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13873 }
13874
13875 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13876 {
13877 Unit* controlled = *itr;
13878 ++itr;
13879
13880 // Xinef: Dont set combat for passive units, they will evade in next update...
13881 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13882 continue;
13883
13884 controlled->SetInCombatState(PvP, enemy, duration);
13885 }
13886
13887 if (Player* player = this->ToPlayer())
13888 {
13889 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13890 }
13891}
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ CREATURE_TYPE_NON_COMBAT_PET
Definition SharedDefines.h:2650
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition SharedDefines.h:2717
@ MOVE_FLIGHT
Definition UnitDefines.h:359
@ MOVE_SWIM
Definition UnitDefines.h:356
bool HasReactState(ReactStates state) const
Definition Creature.h:101
uint32 GetCombatTimer() const
Definition Unit.h:927
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition Unit.cpp:13816
bool IsStandState() const
Definition Unit.cpp:16733

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13659{
13660 // Xinef: Dont allow to start combat with triggers
13661 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13662 return;
13663
13664 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13665 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13666 {
13667 SetInCombatState(true, enemy, duration);
13668 return;
13669 }
13670
13671 // check for duel
13672 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13673 {
13674 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13675 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13676 {
13677 SetInCombatState(true, enemy, duration);
13678 return;
13679 }
13680 }
13681
13682 SetInCombatState(false, enemy, duration);
13683}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1545{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
987{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1114{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15554{
15555 if (!val)
15556 val = 1;
15557
15558 uint32 health = GetHealth();
15560
15561 // group update
15562 if (IsPlayer())
15563 {
15564 Player* player = ToPlayer();
15565 if (player->NeedSendSpectatorData())
15567
15568 if (player->GetGroup())
15570 }
15571 else if (Pet* pet = ToCreature()->ToPet())
15572 {
15573 if (pet->isControlled())
15574 {
15575 if (Unit* owner = GetOwner())
15576 if (Player* player = owner->ToPlayer())
15577 {
15578 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15579 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15580
15581 if (player->GetGroup())
15583 }
15584 }
15585 }
15586
15587 if (val < health)
15588 SetHealth(val);
15589}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15643{
15644 uint32 cur_power = GetPower(power);
15645 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15646
15647 // group update
15648 if (IsPlayer())
15649 {
15650 Player* player = ToPlayer();
15651 if (getPowerType() == power && player->NeedSendSpectatorData())
15652 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15653
15654 if (player->GetGroup())
15656 }
15657 else if (Pet* pet = ToCreature()->ToPet())
15658 {
15659 if (pet->isControlled())
15660 {
15661 Unit* owner = GetOwner();
15662 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15664 }
15665 }
15666
15667 if (val < cur_power)
15668 SetPower(power, val);
15669}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:787

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10762{
10763 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10764
10765 if (apply)
10766 {
10767 if (minion->GetOwnerGUID())
10768 {
10769 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10770 return;
10771 }
10772
10773 minion->SetOwnerGUID(GetGUID());
10774
10775 m_Controlled.insert(minion);
10776
10777 if (IsPlayer())
10778 {
10779 minion->m_ControlledByPlayer = true;
10781 }
10782
10783 // Can only have one pet. If a new one is summoned, dismiss the old one.
10784 if (minion->IsGuardianPet())
10785 {
10786 if (Guardian* oldPet = GetGuardianPet())
10787 {
10788 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10789 {
10790 // remove existing minion pet
10791 if (Pet* oldPetAsPet = oldPet->ToPet())
10792 {
10793 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10794 }
10795 else
10796 {
10797 oldPet->UnSummon();
10798 }
10799
10800 SetPetGUID(minion->GetGUID());
10802 }
10803 }
10804 else
10805 {
10806 SetPetGUID(minion->GetGUID());
10808 }
10809 }
10810
10812 {
10814 }
10815
10816 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10817 {
10818 SetCritterGUID(minion->GetGUID());
10819 }
10820
10821 // PvP, FFAPvP
10823
10824 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10825 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10826 minion->setPowerType(POWER_ENERGY);
10827
10828 if (IsPlayer())
10829 {
10830 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10831 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10832
10833 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10834 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10835 }
10836 }
10837 else
10838 {
10839 if (minion->GetOwnerGUID() != GetGUID())
10840 {
10841 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10842 return;
10843 }
10844
10845 m_Controlled.erase(minion);
10846
10847 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10848 {
10849 if (GetCritterGUID() == minion->GetGUID())
10851 }
10852
10853 if (minion->IsGuardianPet())
10854 {
10855 if (GetPetGUID() == minion->GetGUID())
10857 }
10858 else if (minion->IsTotem())
10859 {
10860 // All summoned by totem minions must disappear when it is removed.
10861 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10862 {
10863 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10864 {
10865 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10866 continue;
10867
10868 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10869 }
10870 }
10871 }
10872
10873 if (IsPlayer())
10874 {
10875 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10876 // Remove infinity cooldown
10877 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10878 ToPlayer()->SendCooldownEvent(spellInfo);
10879
10880 // xinef: clear spell book
10881 if (m_Controlled.empty())
10883 }
10884
10885 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10886 {
10888 {
10889 // Check if there is another minion
10890 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10891 {
10892 // do not use this check, creature do not have charm guid
10893 //if (GetCharmGUID() == (*itr)->GetGUID())
10894 if (GetGUID() == (*itr)->GetCharmerGUID())
10895 continue;
10896
10897 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10898 if ((*itr)->GetOwnerGUID() != GetGUID())
10899 {
10900 OutDebugInfo();
10901 (*itr)->OutDebugInfo();
10902 ABORT();
10903 }
10904 ASSERT((*itr)->IsCreature());
10905
10906 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLLABLE_GUARDIAN))
10907 continue;
10908
10909 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10910 {
10911 // show another pet bar if there is no charm bar
10912 if (IsPlayer() && !GetCharmGUID())
10913 {
10914 if ((*itr)->IsPet())
10916 else
10918 }
10919 }
10920 break;
10921 }
10922 }
10923 }
10924 }
10925}
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:46
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:817
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3549
bool IsGuardianPet() const
Definition TemporarySummon.cpp:390
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void PetSpellInitialize()
Definition Player.cpp:9552
const SummonPropertiesEntry *const m_Properties
Definition TemporarySummon.h:64
uint32 GetSpell(uint8 slot=0) const
Definition Totem.h:59
void OutDebugInfo() const
Definition Unit.cpp:19995
ObjectGuid GetCritterGUID() const
Definition Unit.h:710
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10649
void SetCritterGUID(ObjectGuid guid)
Definition Unit.h:709
void setPowerType(Powers power)
Definition Unit.cpp:10030
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:10939
uint32 Type
Definition DBCStructure.h:1914

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
749{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10650{
10651 if (GetOwnerGUID() == owner)
10652 return;
10653
10655 if (!owner)
10656 return;
10657
10658 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10659
10660 // Update owner dependent fields
10661 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10662 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10663 return;
10664
10666
10667 UpdateData udata;
10668 WorldPacket packet;
10669 BuildValuesUpdateBlockForPlayer(&udata, player);
10670 udata.BuildPacket(packet);
10671 player->SendDirectMessage(&packet);
10672
10674}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:246
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:195
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11431
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19077{
19078 if (newPhaseMask == GetPhaseMask())
19079 return;
19080
19081 if (IsInWorld())
19082 {
19083 // xinef: to comment, bellow line should be removed
19084 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19085 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19086
19087 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19088 return;
19089
19090 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19091 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19092 {
19093 HostileRefMgr& refMgr = getHostileRefMgr();
19094 HostileReference* ref = refMgr.getFirst();
19095
19096 while (ref)
19097 {
19098 if (Unit* unit = ref->GetSource()->GetOwner())
19099 if (Creature* creature = unit->ToCreature())
19100 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19101
19102 ref = ref->next();
19103 }
19104
19105 // modify threat lists for new phasemask
19106 if (!IsPlayer())
19107 {
19110
19111 // merge expects sorted lists
19112 threatList.sort();
19113 offlineThreatList.sort();
19114 threatList.merge(offlineThreatList);
19115
19116 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19117 if (Unit* unit = (*itr)->getTarget())
19118 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19119 }
19120 }
19121 }
19122
19123 WorldObject::SetPhaseMask(newPhaseMask, false);
19124
19125 if (!IsInWorld())
19126 {
19127 return;
19128 }
19129
19130 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19131 {
19132 Unit* controlled = *itr;
19133 ++itr;
19134 if (controlled->IsCreature())
19135 {
19136 controlled->SetPhaseMask(newPhaseMask, true);
19137 }
19138 }
19139
19140 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19141 {
19142 if (m_SummonSlot[i])
19143 {
19144 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19145 {
19146 summon->SetPhaseMask(newPhaseMask, true);
19147 }
19148 }
19149 }
19150
19151 if (update)
19152 {
19154 }
19155}
Definition HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition HostileRefMgr.h:59
HostileReference * next()
Definition ThreatMgr.h:115
FROM * GetSource() const
Definition Reference.h:97
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition ThreatMgr.h:274
Unit * GetOwner() const
Definition ThreatMgr.h:236
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19076
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2891

References Map::GetCreature(), HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15592{
15593 if (!fromRegenerate && GetPower(power) == val)
15594 return;
15595
15596 uint32 maxPower = GetMaxPower(power);
15597 if (maxPower < val)
15598 val = maxPower;
15599
15600 if (fromRegenerate)
15601 {
15604 }
15605 else
15607
15608 if (withPowerUpdate)
15609 {
15610 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15611 data << GetPackGUID();
15612 data << uint8(power);
15613 data << uint32(val);
15614 SendMessageToSet(&data, IsPlayer());
15615 }
15616
15617 // group update
15618 if (IsPlayer())
15619 {
15620 Player* player = ToPlayer();
15621 if (getPowerType() == power && player->NeedSendSpectatorData())
15622 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15623
15624 if (player->GetGroup())
15626 }
15627 else if (Pet* pet = ToCreature()->ToPet())
15628 {
15629 if (pet->isControlled())
15630 {
15631 Unit* owner = GetOwner();
15632 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15634 }
15635
15636 // Update the pet's character sheet with happiness damage bonus
15637 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15638 pet->UpdateDamagePhysical(BASE_ATTACK);
15639 }
15640}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition Group.h:104
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:619
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:652
void AddToObjectUpdateIfNeeded()
Definition Object.cpp:513
@ SMSG_POWER_UPDATE
Definition Opcodes.h:1182

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
10031{
10032 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10033
10034 if (IsPlayer())
10035 {
10036 if (ToPlayer()->GetGroup())
10038 }
10039 else if (Pet* pet = ToCreature()->ToPet())
10040 {
10041 if (pet->isControlled())
10042 {
10043 Unit* owner = GetOwner();
10044 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10046 }
10047 }
10048
10049 float powerMultiplier = 1.0f;
10050 if (!IsPet())
10051 if (Creature* creature = ToCreature())
10052 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10053
10054 switch (new_powertype)
10055 {
10056 default:
10057 case POWER_MANA:
10058 break;
10059 case POWER_RAGE:
10060 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10061 SetPower(POWER_RAGE, 0);
10062 break;
10063 case POWER_FOCUS:
10064 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10065 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10066 break;
10067 case POWER_ENERGY:
10068 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10069 break;
10070 case POWER_HAPPINESS:
10071 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10072 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10073 break;
10074 }
10075
10076 if (Player const* player = ToPlayer())
10077 if (player->NeedSendSpectatorData())
10078 {
10079 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10080 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10081 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10082 }
10083}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15642

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
20898{
20899 if (IsPlayer())
20900 m_race = race;
20901}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
943{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition ThreatMgr.h:301

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  stun = false,
bool  logout = false 
)
protected
18241{
18242 const uint32 state = (stun ? (logout ? UNIT_STATE_LOGOUT_TIMER : UNIT_STATE_STUNNED) : UNIT_STATE_ROOT);
18243
18244 if (apply)
18245 {
18246 AddUnitState(state);
18247
18248 SendMoveRoot(true);
18249 }
18250 else
18251 {
18252 ClearUnitState(state);
18253
18254 // Prevent giving ability to move if more immobilizers are active
18255 if (!IsImmobilizedState())
18256 SendMoveRoot(false);
18257 }
18258}
@ UNIT_STATE_LOGOUT_TIMER
Definition UnitDefines.h:202
bool IsImmobilizedState() const
Definition Unit.h:770
void SendMoveRoot(bool state)
Definition Unit.cpp:18260

References AddUnitState(), ClearUnitState(), IsImmobilizedState(), SendMoveRoot(), UNIT_STATE_LOGOUT_TIMER, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21140{
21142 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21143}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14514{
14515 if (rate < 0)
14516 rate = 0.0f;
14517
14518 // Update speed only on change
14519 if (m_speed_rate[mtype] == rate)
14520 return;
14521
14522 m_speed_rate[mtype] = rate;
14523
14525
14526 SpeedOpcodePair const& speedOpcodes = SetSpeed2Opc_table[mtype];
14527
14528 if (forced && IsClientControlled())
14529 {
14530 Player* player = const_cast<Player*>(GetClientControlling());
14531 uint32 const counter = player->GetSession()->GetOrderCounter();
14532
14533 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14534 // and do it only for real sent packets and use run for run/mounted as client expected
14535 ++player->m_forced_speed_changes[mtype];
14536
14537 WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::PC)], 18);
14538 data << GetPackGUID();
14539 data << counter;
14540 if (mtype == MOVE_RUN)
14541 data << uint8(0); // new 2.1.0
14542
14543 data << GetSpeed(mtype);
14544 player->GetSession()->SendPacket(&data);
14545 player->GetSession()->IncrementOrderCounter();
14546 }
14547 else if (forced)
14548 {
14549 WorldPacket data(speedOpcodes[static_cast<size_t>(SpeedOpcodeIndex::NPC)], 12);
14550 data << GetPackGUID();
14551 data << float(GetSpeed(mtype));
14552 SendMessageToSet(&data, true);
14553 }
14554
14555 if (IsPlayer())
14556 {
14557 // Xinef: update speed of pet also
14558 if (!IsInCombat())
14559 {
14560 Unit* pet = ToPlayer()->GetPet();
14561 if (!pet)
14562 pet = GetCharm();
14563
14564 // xinef: do not affect vehicles and possesed pets
14565 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14566 pet = nullptr;
14567
14568 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14569 pet->UpdateSpeed(mtype, forced);
14570
14571 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14572 critter->UpdateSpeed(mtype, forced);
14573 }
14574 ToPlayer()->SetCanTeleport(true);
14575 }
14576}
@ FOLLOW_MOTION_TYPE
Definition MotionMaster.h:54
const Opcodes SpeedOpcodePair[static_cast< size_t >(SpeedOpcodeIndex::MAX)]
Definition Unit.h:635
SpeedOpcodePair SetSpeed2Opc_table[MAX_MOVE_TYPE]
Definition Unit.h:636
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:949
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2404
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14508
void propagateSpeedChange()
Definition Unit.h:1700

References FOLLOW_MOTION_TYPE, GetCharm(), GetClientControlling(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), Player::GetPet(), Player::GetSession(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldSession::IncrementOrderCounter(), IsClientControlled(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), Player::m_forced_speed_changes, m_speed_rate, MOVE_RUN, NPC, PC, propagateSpeedChange(), WorldObject::SendMessageToSet(), WorldSession::SendPacket(), Player::SetCanTeleport(), SetSpeed2Opc_table, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_volkhan::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16749{
16751
16752 if (IsStandState())
16754
16755 if (IsPlayer())
16756 {
16758 data << (uint8)state;
16759 ToPlayer()->SendDirectMessage(&data);
16760 }
16761}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), Player::SendDirectMessage(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), spell_q12937_relief_for_the_fallen::OnRemove(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), WorldSession::ProcessMovementInfo(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18193{
18195 {
18196 return;
18197 }
18198
18199 if (apply)
18200 {
18201 SetTarget();
18203
18204 if (IsPlayer())
18205 {
18207 }
18208
18209 SetRooted(true, true);
18210
18211 CastStop();
18212 }
18213 else
18214 {
18215 if (IsAlive() && GetVictim())
18217
18218 if (IsCreature())
18219 {
18220 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18221 Unit* owner = GetOwner();
18222 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18224
18225 // Xinef: same for charmed npcs
18226 owner = GetCharmer();
18227 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18229 }
18230 else
18232
18233 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18234 {
18235 SetRooted(false, true);
18236 }
18237 }
18238}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1921{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21201{
21202 Object::SetUInt32Value(index, value);
21203
21204 switch (index)
21205 {
21206 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21207 // We might also need to invalidate the cache for some other fields as well.
21208 case UNIT_FIELD_HEALTH:
21210 break;
21211 }
21212}
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
void InvalidateValuesUpdateCache()
Definition Unit.h:2181

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), WorldSession::ProcessMovementInfo(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

733{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), Player::SetBeastMaster(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21054{
21055 if (slot >= MAX_EQUIPMENT_ITEMS)
21056 return;
21057
21059}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14317{
14318 if (!x)
14320 else
14322
14324}
@ SEC_GAMEMASTER
Definition Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_enslaved_netherwing_drake::MovementInform(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20320{
20321 if (enable == IsWalking())
20322 return false;
20323
20324 if (enable)
20326 else
20328
20330 return true;
20331}

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

void Unit::SetWaterWalking ( bool  enable)
20524{
20525 bool isClientControlled = IsClientControlled();
20526
20527 if (!isClientControlled)
20528 {
20529 if (enable)
20531 else
20533 }
20534
20535 if (!IsInWorld()) // is sent on add to map
20536 return;
20537
20538 if (isClientControlled)
20539 {
20540 if (Player const* player = GetClientControlling())
20541 {
20542 uint32 const counter = player->GetSession()->GetOrderCounter();
20543
20544 WorldPacket data(enable ? SMSG_MOVE_WATER_WALK : SMSG_MOVE_LAND_WALK, GetPackGUID().size() + 4);
20545 data << GetPackGUID();
20546 data << counter;
20547 player->SendDirectMessage(&data);
20548 player->GetSession()->IncrementOrderCounter();
20549 return;
20550 }
20551 }
20552
20554 data << GetPackGUID();
20555 SendMessageToSet(&data, true);
20556}
@ MOVEMENTFLAG_WATERWALKING
Definition UnitDefines.h:397
@ SMSG_MOVE_LAND_WALK
Definition Opcodes.h:253
@ SMSG_SPLINE_MOVE_LAND_WALK
Definition Opcodes.h:808
@ SMSG_MOVE_WATER_WALK
Definition Opcodes.h:252

References MovementInfo::AddMovementFlag(), GetClientControlling(), Object::GetPackGUID(), IsClientControlled(), Object::IsInWorld(), WorldObject::m_movementInfo, MOVEMENTFLAG_WATERWALKING, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), PackedGuid::size(), SMSG_MOVE_LAND_WALK, SMSG_MOVE_WATER_WALK, SMSG_SPLINE_MOVE_LAND_WALK, and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::BuildPlayerRepop(), AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), and Player::ResurrectPlayer().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
12011{
12012 int32 DoneAdvertisedBenefit = 0;
12013
12015 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
12016 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
12017 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
12018 // -1 == any item class (not wand then)
12019 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
12020 // 0 == any inventory type (not wand then)
12021 DoneAdvertisedBenefit += (*i)->GetAmount();
12022
12023 if (IsPlayer())
12024 {
12025 // Base value
12026 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12027 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellDamageBonus();
12028
12029 // Damage bonus from stats
12031 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12032 {
12033 if ((*i)->GetMiscValue() & schoolMask)
12034 {
12035 // stat used stored in miscValueB for this aura
12036 Stats usedStat = Stats((*i)->GetMiscValueB());
12037 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12038 }
12039 }
12040 // ... and attack power
12042 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
12043 if ((*i)->GetMiscValue() & schoolMask)
12044 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12045 }
12046 return DoneAdvertisedBenefit;
12047}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1968
uint32 GetBaseSpellDamageBonus()
Definition Player.h:1969

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellDamageBonus(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
12050{
12051 int32 TakenAdvertisedBenefit = 0;
12052
12054 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12055 if (((*i)->GetMiscValue() & schoolMask) != 0)
12056 {
12057 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12058 // Xinef: required for hemorrhage & rupture / garrote
12059 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
12060 continue;
12061
12062 TakenAdvertisedBenefit += (*i)->GetAmount();
12063 }
12064
12065 return TakenAdvertisedBenefit;
12066}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12777{
12778 int32 AdvertisedBenefit = 0;
12779
12781 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12782 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12783 AdvertisedBenefit += (*i)->GetAmount();
12784
12785 // Healing bonus of spirit, intellect and strength
12786 if (IsPlayer())
12787 {
12788 // Base value
12789 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12790 AdvertisedBenefit += ToPlayer()->GetBaseSpellHealingBonus();
12791
12792 // Healing bonus from stats
12794 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12795 {
12796 // stat used dependent from misc value (stat index)
12797 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12798 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12799 }
12800
12801 // ... and attack power
12803 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12804 if ((*i)->GetMiscValue() & schoolMask)
12805 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12806 }
12807 return AdvertisedBenefit;
12808}
@ SPELL_AURA_MOD_HEALING_DONE
Definition SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition SpellAuraDefines.h:301
uint32 GetBaseSpellHealingBonus()
Definition Player.h:1970

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellHealingBonus(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12811{
12812 int32 AdvertisedBenefit = 0;
12813
12815 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12816 if (((*i)->GetMiscValue() & schoolMask) != 0)
12817 AdvertisedBenefit += (*i)->GetAmount();
12818
12819 return AdvertisedBenefit;
12820}
@ SPELL_AURA_MOD_HEALING
Definition SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12356{
12357 // Calculate critical bonus
12358 int32 crit_bonus = damage;
12359 float crit_mod = 0.0f;
12360
12361 switch (spellProto->DmgClass)
12362 {
12363 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12366 crit_bonus += damage;
12367 break;
12368 default:
12369 crit_bonus += damage / 2; // for spells is 50%
12370 break;
12371 }
12372
12373 if (caster)
12374 {
12375 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12376
12377 if (victim)
12378 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12379
12380 if (crit_bonus != 0 && crit_mod != 0.0f)
12381 AddPct(crit_bonus, crit_mod);
12382
12383 crit_bonus -= damage;
12384
12385 // adds additional damage to critBonus (from talents)
12386 if (Player* modOwner = caster->GetSpellModOwner())
12387 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12388
12389 crit_bonus += damage;
12390 }
12391
12392 return crit_bonus;
12393}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12396{
12397 // Calculate critical bonus
12398 int32 crit_bonus;
12399 switch (spellProto->DmgClass)
12400 {
12401 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12404 crit_bonus = damage;
12405 break;
12406 default:
12407 crit_bonus = damage / 2; // for spells is 50%
12408 break;
12409 }
12410
12411 if (caster)
12412 {
12413 if (victim)
12414 {
12415 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12416 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12417 }
12418
12419 // adds additional damage to critBonus (from talents)
12420 // xinef: used for death knight death coil
12421 if (Player* modOwner = caster->GetSpellModOwner())
12422 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12423 }
12424
12425 if (crit_bonus > 0)
12426 damage += crit_bonus;
12427
12428 if (caster)
12429 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12430
12431 return damage;
12432}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11689{
11690 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11691 return pdamage;
11692
11693 // Some spells don't benefit from done mods
11694 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11695 return pdamage;
11696
11697 // For totems get damage bonus from owner
11698 if (IsCreature())
11699 {
11700 if (IsTotem())
11701 {
11702 if (Unit* owner = GetOwner())
11703 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11704 }
11705 // Dancing Rune Weapon...
11706 else if (GetEntry() == 27893)
11707 {
11708 if (Unit* owner = GetOwner())
11709 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11710 }
11711 }
11712
11713 // Done total percent damage auras
11714 float ApCoeffMod = 1.0f;
11715 int32 DoneTotal = 0;
11716 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11717
11718 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage
11720 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11721
11722 // Some spells don't benefit from pct done mods
11723 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11724 {
11725 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11726 // Add flat bonus from spell damage versus
11728 }
11729
11730 // done scripted mod (take it from owner)
11731 Unit* owner = GetOwner() ? GetOwner() : this;
11732 int32 DoneAdvertisedBenefit = 0;
11733 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11734 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11735 {
11736 if (!(*i)->IsAffectedOnSpell(spellProto))
11737 continue;
11738
11739 switch ((*i)->GetMiscValue())
11740 {
11741 case 4418: // Increased Shock Damage
11742 case 4554: // Increased Lightning Damage
11743 case 4555: // Improved Moonfire
11744 case 5142: // Increased Lightning Damage
11745 case 5147: // Improved Consecration / Libram of Resurgence
11746 case 5148: // Idol of the Shooting Star
11747 case 6008: // Increased Lightning Damage
11748 case 8627: // Totem of Hex
11749 {
11750 DoneAdvertisedBenefit += (*i)->GetAmount();
11751 break;
11752 }
11753 }
11754 }
11755
11756 // Custom scripted damage
11757 switch (spellProto->SpellFamilyName)
11758 {
11759 case SPELLFAMILY_DRUID:
11760 {
11761 // Insect Swarm vs Item - Druid T8 Balance Relic
11762 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11763 {
11764 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11765 {
11766 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11767 }
11768 }
11769
11770 // Nourish vs Idol of the Flourishing Life
11771 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11772 {
11773 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11774 {
11775 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11776 }
11777 }
11778 break;
11779 }
11781 {
11782 // Sigil of the Vengeful Heart
11783 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11784 {
11785 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11786 {
11787 AddPct(DoneTotal, aurEff->GetAmount());
11788 }
11789 }
11790
11791 // Impurity
11793 {
11794 AddPct(ApCoeffMod, aurEff->GetAmount());
11795 }
11796
11797 // Blood Boil - bonus for diseased targets
11798 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11799 {
11800 DoneTotal += 95;
11801 ApCoeffMod = 1.5835f;
11802 }
11803 break;
11804 }
11805 default:
11806 break;
11807 }
11808
11809 // Done fixed damage bonus auras
11810 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11811
11812 // Check for table values
11813 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11814 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11815 if (bonus)
11816 {
11817 if (damagetype == DOT)
11818 {
11819 coeff = bonus->dot_damage;
11820 if (bonus->ap_dot_bonus > 0)
11821 {
11822 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11824 APbonus += GetTotalAttackPowerValue(attType);
11825 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11826 }
11827 }
11828 else
11829 {
11830 coeff = bonus->direct_damage;
11831 if (bonus->ap_bonus > 0)
11832 {
11833 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11835 APbonus += GetTotalAttackPowerValue(attType);
11836 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11837 }
11838 }
11839 }
11840
11841 // Default calculation
11842 if (coeff && DoneAdvertisedBenefit)
11843 {
11844 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11845
11846 if (Player* modOwner = GetSpellModOwner())
11847 {
11848 coeff *= 100.0f;
11849 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11850 coeff /= 100.0f;
11851 }
11852
11853 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11854 }
11855
11856 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11857 // apply spellmod to Done damage (flat and pct)
11858 if (Player* modOwner = GetSpellModOwner())
11859 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11860
11861 return uint32(std::max(tmpDamage, 0.0f));
11862}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition SharedDefines.h:644
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition SpellDefines.h:100
float GetSpellDamageMod(int32 Rank)
Definition Creature.cpp:1624
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:11357
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition Unit.cpp:3077
Definition SpellMgr.h:324
float ap_dot_bonus
Definition SpellMgr.h:328
float dot_damage
Definition SpellMgr.h:326
float ap_bonus
Definition SpellMgr.h:327
float direct_damage
Definition SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11865{
11866 if (!spellProto || damagetype == DIRECT_DAMAGE)
11867 return pdamage;
11868
11869 int32 TakenTotal = 0;
11870 float TakenTotalMod = 1.0f;
11871
11872 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11873 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11875 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11876 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11877 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11878 AddPct(TakenTotalMod, (*i)->GetAmount());
11879
11880 TakenTotalMod = processDummyAuras(TakenTotalMod);
11881
11882 // From caster spells
11883 if (caster)
11884 {
11886 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11887 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11888 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11889 AddPct(TakenTotalMod, (*i)->GetAmount());
11890 }
11891
11892 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11893 {
11894 int32 modifierMax = 0;
11895 int32 modifierMin = 0;
11897 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11898 {
11899 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11900 continue;
11901
11902 // Only death knight spell with this aura
11903 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11904 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11905 continue;
11906
11907 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11908 {
11909 if ((*i)->GetAmount() > 0)
11910 {
11911 if ((*i)->GetAmount() > modifierMax)
11912 modifierMax = (*i)->GetAmount();
11913 }
11914 else if ((*i)->GetAmount() < modifierMin)
11915 modifierMin = (*i)->GetAmount();
11916 }
11917 }
11918
11919 AddPct(TakenTotalMod, modifierMax);
11920 AddPct(TakenTotalMod, modifierMin);
11921 }
11922
11923 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11924
11925 // Check for table values
11926 float coeff = 0;
11927 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11928 if (bonus)
11929 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11930
11931 // Default calculation
11932 if (TakenAdvertisedBenefit)
11933 {
11934 if (coeff <= 0.0f)
11935 {
11936 if (caster)
11937 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11938 else
11939 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11940 }
11941
11942 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11943 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11944 }
11945
11946 // No positive taken bonus, custom attr
11947 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11948 {
11949 TakenTotal = 0;
11950 TakenTotalMod = 1.0f;
11951 }
11952
11953 // xinef: sanctified wrath talent
11954 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
11955 {
11956 float ignoreModifier = 1.0f - TakenTotalMod;
11957 bool addModifier = false;
11959 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11960 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11961 {
11962 ApplyPct(ignoreModifier, (*j)->GetAmount());
11963 addModifier = true;
11964 }
11965
11966 if (addModifier)
11967 TakenTotalMod += ignoreModifier;
11968 }
11969
11970 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11971
11972 return uint32(std::max(tmpDamage, 0.0f));
11973}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition Unit.cpp:17218

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealDamageShieldDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12069{
12070 // Mobs can't crit with spells.
12071 if (IsCreature() && !GetSpellModOwner())
12072 return -100.0f;
12073
12074 // not critting spell
12075 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12076 return 0.0f;
12077
12078 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12079 if (!skipEffectCheck && !spellProto->IsCritCapable())
12080 return 0.0f;
12081
12082 float crit_chance = 0.0f;
12083 switch (spellProto->DmgClass)
12084 {
12086 {
12087 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12088 crit_chance = 0.0f;
12089 // For other schools
12090 else if (IsPlayer())
12091 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12092 else
12093 {
12094 crit_chance = (float)m_baseSpellCritChance;
12096 }
12097 break;
12098 }
12101 {
12102 if (IsPlayer())
12103 {
12104 switch (attackType)
12105 {
12106 case BASE_ATTACK:
12108 break;
12109 case OFF_ATTACK:
12111 break;
12112 case RANGED_ATTACK:
12114 break;
12115 default:
12116 break;
12117 }
12118 }
12119 else
12120 {
12121 crit_chance = 5.0f;
12124 }
12126 break;
12127 }
12128 // values overridden in spellmgr for lifebloom and earth shield
12130 default:
12131 return 0.0f;
12132 }
12133
12134 // percent done
12135 // only players use intelligence for critical chance computations
12136 if (Player* modOwner = GetSpellModOwner())
12137 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12138
12139 // xinef: can be negative!
12140 return crit_chance;
12141}
@ SPELL_ATTR2_CANT_CRIT
Definition SharedDefines.h:496
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12527{
12528 // For totems get healing bonus from owner (statue isn't totem in fact)
12529 if (IsCreature() && IsTotem())
12530 if (Unit* owner = GetOwner())
12531 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12532
12533 // No bonus healing for potion spells
12534 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12535 return healamount;
12536
12537 float ApCoeffMod = 1.0f;
12538 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12539 int32 DoneTotal = 0;
12540
12541 // done scripted mod (take it from owner)
12542 Unit* owner = GetOwner() ? GetOwner() : this;
12543 int32 DoneAdvertisedBenefit = 0;
12544 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12545 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12546 {
12547 if (!(*i)->IsAffectedOnSpell(spellProto))
12548 continue;
12549
12550 switch ((*i)->GetMiscValue())
12551 {
12552 case 4415: // Increased Rejuvenation Healing
12553 case 4953:
12554 DoneAdvertisedBenefit += (*i)->GetAmount();
12555 break;
12556 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12557 DoneAdvertisedBenefit += (*i)->GetAmount();
12558 break;
12559 }
12560 }
12561
12562 switch (spellProto->SpellFamilyName)
12563 {
12565 {
12566 // Impurity
12568 {
12569 AddPct(ApCoeffMod, aurEff->GetAmount());
12570 }
12571 break;
12572 }
12573 default:
12574 break;
12575 }
12576
12577 // Done fixed damage bonus auras
12578 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12579 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12580
12581 // Check for table values
12582 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12583 if (bonus)
12584 {
12585 if (damagetype == DOT)
12586 {
12587 coeff = bonus->dot_damage;
12588 if (bonus->ap_dot_bonus > 0)
12589 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12590 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12591 }
12592 else
12593 {
12594 coeff = bonus->direct_damage;
12595 if (bonus->ap_bonus > 0)
12596 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12597 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12598 }
12599 }
12600 else
12601 {
12602 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12603 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12604 return healamount;
12605 }
12606
12607 // Default calculation
12608 if (DoneAdvertisedBenefit)
12609 {
12610 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12611 if (Player* modOwner = GetSpellModOwner())
12612 {
12613 coeff *= 100.0f;
12614 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12615 coeff /= 100.0f;
12616 }
12617 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12618 }
12619
12620 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12621 {
12622 switch (spellProto->Effects[i].ApplyAuraName)
12623 {
12624 // Bonus healing does not apply to these spells
12627 DoneTotal = 0;
12628 break;
12629 }
12630 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12631 DoneTotal = 0;
12632 }
12633
12634 // use float as more appropriate for negative values and percent applying
12635 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12636 // apply spellmod to Done amount
12637
12638 if (Player* modOwner = GetSpellModOwner())
12639 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12640
12641 return uint32(std::max(heal, 0.0f));
12642}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12776
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:12434

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12645{
12646 float TakenTotalMod = 1.0f;
12647 float minval = 0.0f;
12648
12649 // Healing taken percent
12650 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12651 {
12653 }
12654
12655 if (minval)
12656 AddPct(TakenTotalMod, minval);
12657
12659 if (maxval)
12660 AddPct(TakenTotalMod, maxval);
12661
12662 // Tenacity increase healing % taken
12663 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12664 AddPct(TakenTotalMod, Tenacity->GetAmount());
12665
12666 // Healing Done
12667 int32 TakenTotal = 0;
12668
12669 // Taken fixed damage bonus auras
12670 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12671
12672 // Nourish cast, glyph of nourish
12673 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12674 {
12675 bool any = false;
12676 bool hasglyph = caster->GetAuraEffectDummy(62971);
12678 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12679 {
12680 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12681 {
12682 SpellInfo const* spell = (*i)->GetSpellInfo();
12683 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12684 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12685 {
12686 TakenTotalMod *= 1.2f;
12687 any = true;
12688 }
12689
12690 if (hasglyph)
12691 TakenTotalMod += 0.06f;
12692 }
12693 }
12694 }
12695
12696 if (damagetype == DOT)
12697 {
12698 // Healing over time taken percent
12699 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12700 if (minval_hot)
12701 AddPct(TakenTotalMod, minval_hot);
12702
12703 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12704 if (maxval_hot)
12705 AddPct(TakenTotalMod, maxval_hot);
12706 }
12707
12708 // Check for table values
12709 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12710 float coeff = 0;
12711 float factorMod = 1.0f;
12712 if (bonus)
12713 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12714 else
12715 {
12716 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12717 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12718 {
12719 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12720 return healamount;
12721 }
12722 }
12723
12724 // Default calculation
12725 if (TakenAdvertisedBenefit)
12726 {
12727 float TakenCoeff = 0.0f;
12728 if (coeff <= 0)
12729 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12730
12731 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12732 if (Player* modOwner = GetSpellModOwner())
12733 {
12734 coeff *= 100.0f;
12735 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12736 coeff /= 100.0f;
12737 }
12738
12739 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12740 }
12741
12742 if (caster)
12743 {
12745 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12746 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12747 AddPct(TakenTotalMod, (*i)->GetAmount());
12748 }
12749
12750 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12751 {
12752 switch (spellProto->Effects[i].ApplyAuraName)
12753 {
12754 // Bonus healing does not apply to these spells
12757 TakenTotal = 0;
12758 break;
12759 }
12760 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12761 TakenTotal = 0;
12762 }
12763
12764 // No positive taken bonus, custom attr
12765 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12766 {
12767 TakenTotal = 0;
12768 TakenTotalMod = 1.0f;
12769 }
12770
12771 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12772
12773 return uint32(std::max(heal, 0.0f));
12774}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition SharedDefines.h:642
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition SpellAuraDefines.h:322
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition Unit.cpp:6034
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition Unit.cpp:6048
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition Unit.cpp:12810

References AddPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), SpellInfo::HasAttribute(), flag96::HasFlag(), SpellInfo::Id, MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HEALING_RECEIVED, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3573{
3574 SpellInfo const* spellInfo = spell->GetSpellInfo();
3575
3576 // Check for immune
3577 if (victim->IsImmunedToSpell(spellInfo, spell))
3578 {
3579 return SPELL_MISS_IMMUNE;
3580 }
3581
3582 // All positive spells can`t miss
3584 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3585 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3586 {
3587 return SPELL_MISS_NONE;
3588 }
3589
3590 // Check for immune
3591 // xinef: check for school immunity only
3592 if (victim->IsImmunedToSchool(spell))
3593 {
3594 return SPELL_MISS_IMMUNE;
3595 }
3596
3597 if (this == victim)
3598 {
3599 return SPELL_MISS_NONE;
3600 }
3601
3602 // Return evade for units in evade mode
3603 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3605 {
3606 return SPELL_MISS_EVADE;
3607 }
3608
3609 // Try victim reflect spell
3610 if (CanReflect)
3611 {
3612 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3613 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3614 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3615 {
3616 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3617 {
3618 reflectchance += (*i)->GetAmount();
3619 }
3620 }
3621
3622 if (reflectchance > 0 && roll_chance_i(reflectchance))
3623 {
3624 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3625 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3626 return SPELL_MISS_REFLECT;
3627 }
3628 }
3629
3630 switch (spellInfo->DmgClass)
3631 {
3634 return MeleeSpellHitResult(victim, spellInfo);
3636 {
3637 if (spellInfo->SpellFamilyName)
3638 {
3639 return SPELL_MISS_NONE;
3640 }
3641
3642 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3643 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3644 {
3645 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3646 {
3647 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3648 {
3649 return SPELL_MISS_NONE;
3650 }
3651 }
3652 }
3653 [[fallthrough]];
3654 }
3656 return MagicSpellHitResult(victim, spellInfo);
3657 }
3658
3659 return SPELL_MISS_NONE;
3660}
@ SPELL_EFFECT_DISPEL
Definition SharedDefines.h:827
@ SPELL_MISS_IMMUNE
Definition SharedDefines.h:1537
@ SPELL_MISS_EVADE
Definition SharedDefines.h:1536
@ SPELL_MISS_REFLECT
Definition SharedDefines.h:1541
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3364
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3191

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3508{
3509 // Check for immune
3510 if (victim->IsImmunedToSpell(spell))
3511 return SPELL_MISS_IMMUNE;
3512
3513 // All positive spells can`t miss
3515 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3516 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3517 return SPELL_MISS_NONE;
3518
3519 // Check for immune
3520 // xinef: check for school immunity only
3521 if (victim->IsImmunedToSchool(spell))
3522 return SPELL_MISS_IMMUNE;
3523
3524 if (this == victim)
3525 return SPELL_MISS_NONE;
3526
3527 // Return evade for units in evade mode
3528 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3529 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3530 return SPELL_MISS_EVADE;
3531
3532 // Try victim reflect spell
3533 if (CanReflect)
3534 {
3535 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3536 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3537 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3538 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3539 reflectchance += (*i)->GetAmount();
3540 if (reflectchance > 0 && roll_chance_i(reflectchance))
3541 {
3542 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3543 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3544 return SPELL_MISS_REFLECT;
3545 }
3546 }
3547
3548 switch (spell->DmgClass)
3549 {
3552 return MeleeSpellHitResult(victim, spell);
3554 {
3555 if (spell->SpellFamilyName)
3556 {
3557 return SPELL_MISS_NONE;
3558 }
3559 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3560 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3561 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3562 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3563 return SPELL_MISS_NONE;
3564 [[fallthrough]];
3565 }
3567 return MagicSpellHitResult(victim, spell);
3568 }
3569 return SPELL_MISS_NONE;
3570}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealDamageShieldDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11358{
11359 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11360 return 1.0f;
11361
11362 // Some spells don't benefit from done mods
11363 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11364 return 1.0f;
11365
11366 // For totems get damage bonus from owner
11367 if (IsCreature())
11368 {
11369 if (IsTotem())
11370 {
11371 if (Unit* owner = GetOwner())
11372 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11373 }
11374 // Dancing Rune Weapon...
11375 else if (GetEntry() == 27893)
11376 {
11377 if (Unit* owner = GetOwner())
11378 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11379 }
11380 }
11381
11382 // Done total percent damage auras
11383 float DoneTotalMod = 1.0f;
11384
11386 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11387 {
11388 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11389 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11390 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11391 {
11392 continue;
11393 }
11394
11395 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11396 continue;
11397
11398 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11399 continue;
11400
11401 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11402 {
11403 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11404 AddPct(DoneTotalMod, (*i)->GetAmount());
11405 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11406 AddPct(DoneTotalMod, (*i)->GetAmount());
11407 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11408 AddPct(DoneTotalMod, (*i)->GetAmount());
11409 }
11410 }
11411
11412 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11414 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11415 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11416 AddPct(DoneTotalMod, (*i)->GetAmount());
11417
11418 // bonus against aurastate
11420 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11421 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11422 AddPct(DoneTotalMod, (*i)->GetAmount());
11423
11424 // done scripted mod (take it from owner)
11425 Unit* owner = GetOwner() ? GetOwner() : this;
11426 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11427 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11428 {
11429 // Xinef: self cast is ommited (because of Rage of Rivendare)
11430 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11431 continue;
11432
11433 // xinef: Molten Fury should work on all spells
11434 switch ((*i)->GetMiscValue())
11435 {
11436 case 4920: // Molten Fury
11437 case 4919:
11438 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11439 AddPct(DoneTotalMod, (*i)->GetAmount());
11440 break;
11441 }
11442
11443 if (!(*i)->IsAffectedOnSpell(spellProto))
11444 continue;
11445
11446 switch ((*i)->GetMiscValue())
11447 {
11448 case 6917: // Death's Embrace
11449 case 6926:
11450 case 6928:
11451 {
11452 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11453 AddPct(DoneTotalMod, (*i)->GetAmount());
11454 break;
11455 }
11456 // Soul Siphon
11457 case 4992:
11458 case 4993:
11459 {
11460 // effect 1 m_amount
11461 int32 maxPercent = (*i)->GetAmount();
11462 // effect 0 m_amount
11463 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11464 // count affliction effects and calc additional damage in percentage
11465 int32 modPercent = 0;
11466 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11467 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11468 {
11469 Aura const* aura = itr->second->GetBase();
11470 SpellInfo const* m_spell = aura->GetSpellInfo();
11471 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11472 continue;
11473 modPercent += stepPercent * aura->GetStackAmount();
11474 if (modPercent >= maxPercent)
11475 {
11476 modPercent = maxPercent;
11477 break;
11478 }
11479 }
11480 AddPct(DoneTotalMod, modPercent);
11481 break;
11482 }
11483 case 6916: // Death's Embrace
11484 case 6925:
11485 case 6927:
11486 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11487 AddPct(DoneTotalMod, (*i)->GetAmount());
11488 break;
11489 case 5481: // Starfire Bonus
11490 {
11491 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11492 AddPct(DoneTotalMod, (*i)->GetAmount());
11493 break;
11494 }
11495 // Tundra Stalker
11496 // Merciless Combat
11497 case 7277:
11498 {
11499 // Merciless Combat
11500 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11501 {
11502 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11503 if (!victim->HealthAbovePct(35))
11504 AddPct(DoneTotalMod, (*i)->GetAmount());
11505 }
11506 // Tundra Stalker
11507 else
11508 {
11509 // Frost Fever (target debuff)
11510 if (victim->HasAura(55095))
11511 AddPct(DoneTotalMod, (*i)->GetAmount());
11512 break;
11513 }
11514 break;
11515 }
11516 // Rage of Rivendare
11517 case 7293:
11518 {
11520 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11521 break;
11522 }
11523 // Twisted Faith
11524 case 7377:
11525 {
11527 AddPct(DoneTotalMod, (*i)->GetAmount());
11528 break;
11529 }
11530 // Marked for Death
11531 case 7598:
11532 case 7599:
11533 case 7600:
11534 case 7601:
11535 case 7602:
11536 {
11537 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11538 AddPct(DoneTotalMod, (*i)->GetAmount());
11539 break;
11540 }
11541 // Dirty Deeds
11542 case 6427:
11543 case 6428:
11544 case 6579:
11545 case 6580:
11546 {
11547 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11548 {
11549 // effect 0 has expected value but in negative state
11550 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11551 AddPct(DoneTotalMod, bonus);
11552 }
11553 break;
11554 }
11555 }
11556 }
11557
11558 // Custom scripted damage
11559 switch (spellProto->SpellFamilyName)
11560 {
11561 case SPELLFAMILY_MAGE:
11562 // Ice Lance
11563 if (spellProto->SpellIconID == 186)
11564 {
11565 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11566 {
11567 // Glyph of Ice Lance
11568 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11569 DoneTotalMod *= 4.0f;
11570 else
11571 DoneTotalMod *= 3.0f;
11572 }
11573 }
11574
11575 // Torment the weak
11576 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11577 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11579 AddPct(DoneTotalMod, aurEff->GetAmount());
11580 break;
11581 case SPELLFAMILY_PRIEST:
11582 // Mind Flay
11583 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11584 {
11585 // Glyph of Shadow Word: Pain
11586 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11587 // Increase Mind Flay damage if Shadow Word: Pain present on target
11589 AddPct(DoneTotalMod, aurEff->GetAmount());
11590
11591 // Twisted Faith - Mind Flay part
11593 // Increase Mind Flay damage if Shadow Word: Pain present on target
11595 AddPct(DoneTotalMod, aurEff->GetAmount());
11596 }
11597 // Smite
11598 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11599 {
11600 // Glyph of Smite
11601 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11602 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11603 AddPct(DoneTotalMod, aurEff->GetAmount());
11604 }
11605 // Shadow Word: Death
11606 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11607 {
11608 // Glyph of Shadow Word: Death
11609 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11611 AddPct(DoneTotalMod, aurEff->GetAmount());
11612 }
11613
11614 break;
11616 // Judgement of Vengeance/Judgement of Corruption
11617 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11618 {
11619 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11620 uint32 stacks = 0;
11622 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11623 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11624 {
11625 stacks = (*itr)->GetBase()->GetStackAmount();
11626 break;
11627 }
11628 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11629 if (stacks)
11630 AddPct(DoneTotalMod, 10 * stacks);
11631 }
11632 break;
11633 case SPELLFAMILY_DRUID:
11634 // Thorns
11635 if (spellProto->SpellFamilyFlags[0] & 0x100)
11636 {
11637 // Brambles
11638 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11639 AddPct(DoneTotalMod, aurEff->GetAmount());
11640 }
11641 break;
11643 // Fire and Brimstone
11644 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11646 {
11648 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11649 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11650 {
11651 AddPct(DoneTotalMod, (*i)->GetAmount());
11652 break;
11653 }
11654 }
11655 // Drain Soul - increased damage for targets under 25 % HP
11656 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11657 if (!victim->HealthAbovePct(25))
11658 DoneTotalMod *= 4;
11659 // Shadow Bite (15% increase from each dot)
11660 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11661 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11662 AddPct(DoneTotalMod, 15 * count);
11663 break;
11664 case SPELLFAMILY_HUNTER:
11665 // Steady Shot
11666 if (spellProto->SpellFamilyFlags[1] & 0x1)
11667 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11668 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11669 AddPct(DoneTotalMod, aurEff->GetAmount());
11670 break;
11672 // Improved Icy Touch
11673 if (spellProto->SpellFamilyFlags[0] & 0x2)
11675 AddPct(DoneTotalMod, aurEff->GetAmount());
11676
11677 // Glacier Rot
11678 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11680 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11681 AddPct(DoneTotalMod, aurEff->GetAmount());
11682 break;
11683 }
11684
11685 return DoneTotalMod;
11686}
@ MECHANIC_SLOW_ATTACK
Definition SharedDefines.h:1344
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1304
@ AURA_STATE_CONFLAGRATE
Definition SharedDefines.h:1317
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition Unit.cpp:5912
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition Unit.cpp:5883
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition Unit.cpp:5966

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12435{
12436 // For totems get healing bonus from owner (statue isn't totem in fact)
12437 if (IsCreature() && IsTotem())
12438 if (Unit* owner = GetOwner())
12439 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12440
12441 // Some spells don't benefit from done mods
12442 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12443 return 1.0f;
12444
12445 // xinef: Some spells don't benefit from done mods
12446 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12447 return 1.0f;
12448
12449 // No bonus healing for potion spells
12450 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12451 return 1.0f;
12452
12453 float DoneTotalMod = 1.0f;
12454
12455 // Healing done percent
12457 for (auto const& auraEff : mHealingDonePct)
12458 {
12459 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12460 continue;
12461
12462 AddPct(DoneTotalMod, auraEff->GetAmount());
12463 }
12464
12465 // done scripted mod (take it from owner)
12466 Unit* owner = GetOwner() ? GetOwner() : this;
12467 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12468 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12469 {
12470 if (!(*i)->IsAffectedOnSpell(spellProto))
12471 continue;
12472
12473 switch ((*i)->GetMiscValue())
12474 {
12475 case 21: // Test of Faith
12476 case 6935:
12477 case 6918:
12478 if (victim->HealthBelowPct(50))
12479 AddPct(DoneTotalMod, (*i)->GetAmount());
12480 break;
12481 case 7798: // Glyph of Regrowth
12482 {
12484 AddPct(DoneTotalMod, (*i)->GetAmount());
12485 break;
12486 }
12487
12488 case 7871: // Glyph of Lesser Healing Wave
12489 {
12490 // xinef: affected by any earth shield
12491 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12492 AddPct(DoneTotalMod, (*i)->GetAmount());
12493 break;
12494 }
12495 default:
12496 break;
12497 }
12498 }
12499
12500 switch (spellProto->SpellFamilyName)
12501 {
12503 // Talents and glyphs for healing stream totem
12504 if (spellProto->Id == 52042)
12505 {
12506 // Glyph of Healing Stream Totem
12507 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12508 AddPct(DoneTotalMod, dummy->GetAmount());
12509
12510 // Healing Stream totem - Restorative Totems
12511 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12512 AddPct(DoneTotalMod, aurEff->GetAmount());
12513 }
12514 break;
12515 case SPELLFAMILY_PRIEST:
12516 // T9 HEALING 4P, empowered renew instant heal
12517 if (spellProto->Id == 63544)
12518 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12519 AddPct(DoneTotalMod, aurEff->GetAmount());
12520 break;
12521 }
12522
12523 return DoneTotalMod;
12524}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, and sScriptMgr.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12144{
12145 // not critting spell
12146 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12147 return 0.0f;
12148
12149 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12150 if (!skipEffectCheck && !spellProto->IsCritCapable())
12151 return 0.0f;
12152
12153 float crit_chance = doneChance;
12154 switch (spellProto->DmgClass)
12155 {
12157 {
12158 if (!spellProto->IsPositive())
12159 {
12160 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12161 // xinef: apply max and min only
12163 {
12166 }
12167
12168 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12169 }
12170 // scripted (increase crit chance ... against ... target by x%
12171 if (caster)
12172 {
12173 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12174 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12175 {
12176 if (!((*i)->IsAffectedOnSpell(spellProto)))
12177 continue;
12178 int32 modChance = 0;
12179 switch ((*i)->GetMiscValue())
12180 {
12181 // Shatter
12182 case 911:
12183 modChance += 16;
12184 [[fallthrough]];
12185 case 910:
12186 modChance += 17;
12187 [[fallthrough]];
12188 case 849:
12189 modChance += 17;
12190 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12191 break;
12192 crit_chance += modChance;
12193 break;
12194 case 7917: // Glyph of Shadowburn
12195 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12196 crit_chance += (*i)->GetAmount();
12197 break;
12198 case 7997: // Renewed Hope
12199 case 7998:
12200 if (HasAura(6788))
12201 crit_chance += (*i)->GetAmount();
12202 break;
12203 default:
12204 break;
12205 }
12206 }
12207 // Custom crit by class
12208 switch (spellProto->SpellFamilyName)
12209 {
12210 case SPELLFAMILY_MAGE:
12211 // Glyph of Fire Blast
12212 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12214 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12215 crit_chance += aurEff->GetAmount();
12216 break;
12217 case SPELLFAMILY_DRUID:
12218 // Improved Faerie Fire
12220 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12221 crit_chance += aurEff->GetAmount();
12222
12223 // cumulative effect - don't break
12224
12225 // Starfire
12226 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12227 {
12228 // Improved Insect Swarm
12229 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12231 crit_chance += aurEff->GetAmount();
12232 break;
12233 }
12234 break;
12235 case SPELLFAMILY_ROGUE:
12236 // Shiv-applied poisons can't crit
12237 if (caster->FindCurrentSpellBySpellId(5938))
12238 crit_chance = 0.0f;
12239 break;
12241 // Flash of light
12242 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12243 {
12244 // Sacred Shield
12245 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12246 crit_chance += aura->GetAmount();
12247 break;
12248 }
12249 // Exorcism
12250 else if (spellProto->GetCategory() == 19)
12251 {
12253 return 100.0f;
12254 break;
12255 }
12256 break;
12257 case SPELLFAMILY_SHAMAN:
12258 // Lava Burst
12259 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12260 {
12261 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12263 return 100.0f;
12264 break;
12265 }
12266 break;
12267 }
12268 }
12269 break;
12270 }
12272 // Custom crit by class
12273 if (caster)
12274 {
12275 switch (spellProto->SpellFamilyName)
12276 {
12277 case SPELLFAMILY_DRUID:
12278 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12279 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12280 {
12281 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12282 crit_chance += rendAndTear->GetAmount();
12283 break;
12284 }
12285 break;
12287 // Victory Rush
12288 if (spellProto->SpellFamilyFlags[1] & 0x100)
12289 {
12290 // Glyph of Victory Rush
12291 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12292 crit_chance += aurEff->GetAmount();
12293 break;
12294 }
12295 break;
12296 }
12297 }
12298
12299 // 100% critical chance against sitting target
12301 {
12302 return 100.0f;
12303 }
12304 [[fallthrough]];
12306 {
12307 // flat aura mods
12308 if (attackType == RANGED_ATTACK)
12310 else
12312
12313 // reduce crit chance from Rating for players
12314 if (attackType != RANGED_ATTACK)
12315 {
12316 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12317 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12318 }
12319 else
12320 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12321
12322 // Apply crit chance from defence skill
12323 if (caster)
12324 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12325
12326 break;
12327 }
12328 // values overridden in spellmgr for lifebloom and earth shield
12330 default:
12331 return 0.0f;
12332 }
12333
12334 if (caster)
12335 {
12337 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12338 {
12339 if (caster->GetGUID() != (*i)->GetCasterGUID())
12340 continue;
12341
12342 crit_chance += (*i)->GetAmount();
12343 }
12344 }
12345
12346 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12347 // xinef: should be calculated at the end
12348 if (!spellProto->IsPositive())
12350
12351 // xinef: can be negative!
12352 return crit_chance;
12353}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition SharedDefines.h:2654
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1350
@ AURA_STATE_BLEEDING
Definition SharedDefines.h:1321
@ AURA_STATE_FAERIE_FIRE
Definition SharedDefines.h:1315
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition Unit.cpp:6085
bool HasAttackerSpellCritChanceAura() const
Definition Unit.h:1787
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6099

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition Unit.h:599

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
19931{
19932 if (Unit* victim = GetVictim())
19933 {
19934 if (victim->GetFactionTemplateEntry()->faction == faction_id)
19935 {
19936 AttackStop();
19937 if (IsNonMeleeSpellCast(false))
19939
19940 // melee and ranged forced attack cancel
19941 if (IsPlayer())
19943 }
19944 }
19945
19946 AttackerSet const& attackers = getAttackers();
19947 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
19948 {
19949 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
19950 {
19951 (*itr)->AttackStop();
19952 itr = attackers.begin();
19953 }
19954 else
19955 ++itr;
19956 }
19957
19959
19960 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
19961 (*itr)->StopAttackFaction(faction_id);
19962}
void deleteReferencesForFaction(uint32 faction)
Definition HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
19965{
19966 AttackerSet const& attackers = getAttackers();
19967 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
19968 {
19969 Unit* attacker = (*itr);
19970 if (!attacker->IsValidAttackTarget(this))
19971 {
19972 attacker->AttackStop();
19973 if (attacker->IsPlayer())
19974 {
19976 }
19977
19978 for (Unit* controlled : attacker->m_Controlled)
19979 {
19980 if (controlled->GetVictim() == this && !controlled->IsValidAttackTarget(this))
19981 {
19982 controlled->AttackStop();
19983 }
19984 }
19985
19986 itr = attackers.begin();
19987 }
19988 else
19989 {
19990 ++itr;
19991 }
19992 }
19993}

References AttackStop(), getAttackers(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16657{
16659
16660 // not need send any packets if not in world or not moving
16661 if (!IsInWorld())
16662 return;
16663
16664 if (movespline->Finalized())
16665 return;
16666
16667 // Update position now since Stop does not start a new movement that can be updated later
16668 if (movespline->HasStarted())
16670
16671 Movement::MoveSplineInit init(this);
16672 init.Stop();
16673}
bool HasStarted() const
Definition MoveSpline.h:130
void UpdateSplinePosition()
Definition Unit.cpp:608

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SendMoveRoot(), SetCharmedBy(), SmartAI::SetCombatMovement(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16696{
16698
16699 // not need send any packets if not in world
16700 if (!IsInWorld())
16701 return;
16702
16703 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16704 Movement::MoveSplineInit init(this);
16705 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16706 init.SetFacing(GetOrientation());
16707 init.Launch();
16708}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
21010{
21011 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
21014 Cell::VisitObjects(this, worker, textRange);
21015}
Definition ChatTextBuilder.h:49
Definition GridNotifiers.h:1737
Definition GridNotifiers.h:583

References Cell::VisitObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21062{
21063 if (!sObjectMgr->GetBroadcastText(textId))
21064 {
21065 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21066 return;
21067 }
21068
21069 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21072 Cell::VisitObjects(this, worker, textRange);
21073}
Definition ChatTextBuilder.h:31
uint8 getGender() const
Definition Unit.h:831

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14690{
14691 ASSERT(IsCreature());
14692
14693 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14694 return;
14695
14696 if (!CanHaveThreatList())
14697 return;
14698
14699 Creature* creature = ToCreature();
14700
14701 if (creature->HasReactState(REACT_PASSIVE))
14702 return;
14703
14704 Unit* target = GetVictim();
14705 if (target && target == taunter)
14706 return;
14707
14708 SetInFront(taunter);
14709 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14710
14711 if (creature->IsAIEnabled)
14712 creature->AI()->AttackStart(taunter);
14713
14714 //m_ThreatMgr.tauntApply(taunter);
14715}
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20276

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14720{
14721 ASSERT(IsCreature());
14722
14723 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14724 return;
14725
14726 if (!CanHaveThreatList())
14727 return;
14728
14729 Creature* creature = ToCreature();
14730
14731 if (creature->HasReactState(REACT_PASSIVE))
14732 return;
14733
14734 Unit* target = GetVictim();
14735 if (!target || target != taunter)
14736 return;
14737
14739 {
14740 if (creature->IsAIEnabled)
14742 return;
14743 }
14744
14745 target = creature->SelectVictim(); // might have more taunt auras remaining
14746
14747 if (target && target != taunter)
14748 {
14750 SetInFront(target);
14751 if (creature->IsAIEnabled)
14752 creature->AI()->AttackStart(target);
14753 }
14754}
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:90
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:215
Unit * SelectVictim()
Definition Unit.cpp:14758
bool isThreatListEmpty() const
Definition ThreatMgr.h:224

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21086{
21087 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21088}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
716{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), Creature::IsUpdateNeeded(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
717{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
715{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16551{
16552 DamageInfo dmgInfo = DamageInfo(damageInfo);
16553 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16554}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition Unit.cpp:16550

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent(), and TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16576{
16577 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16578 {
16579 if (!(*itr)->GetRemoveMode())
16580 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16581 }
16582}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16557{
16558 // prepare data for self trigger
16559 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16560 std::list<AuraApplication*> myAurasTriggeringProc;
16561 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16562
16563 // prepare data for target trigger
16564 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16565 std::list<AuraApplication*> targetAurasTriggeringProc;
16566 if (typeMaskActionTarget)
16567 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16568
16569 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16570
16571 if (typeMaskActionTarget)
16572 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16573}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition Unit.cpp:16520

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11279{
11280 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11281 {
11282 if (!m_SummonSlot[i])
11283 {
11284 continue;
11285 }
11286
11287 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11288 {
11289 if (OldTotem->IsSummon())
11290 {
11291 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11292 {
11293 OldTotem->ToTempSummon()->UnSummon();
11294 }
11295 }
11296 }
11297 }
11298}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

384{
385 sScriptMgr->OnUnitUpdate(this, p_time);
386
387 // WARNING! Order of execution here is important, do not change.
388 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
389 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
390 WorldObject::Update(p_time);
391
392 if (!IsInWorld())
393 return;
394
395 // pussywizard:
396 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
397 {
399 {
401 {
403 //ExecuteDelayedUnitRelocationEvent();
405 }
406 else
408 }
410 {
411 if (m_delayed_unit_ai_notify_timer <= p_time)
412 {
415 }
416 else
418 }
419 }
420
421 _UpdateSpells( p_time );
422
423 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
425
426 // update combat timer only for players and pets (only pets with PetAI)
428 {
429 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
430 // targets without stopping half way there and running off.
431 // These flags are reset after target dies or another command is given.
433 {
434 // m_CombatTimer set at aura start and it will be freeze until aura removing
435 if (m_CombatTimer <= p_time)
437 else
438 m_CombatTimer -= p_time;
439 }
440 }
441
444 {
445 while (!extraAttacksTargets.empty())
446 {
447 auto itr = extraAttacksTargets.begin();
448 ObjectGuid targetGuid = itr->first;
449 uint32 count = itr->second;
450 extraAttacksTargets.erase(itr);
451 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
452 {
454 || victim->IsWithinMeleeRange(this))
455 {
456 HandleProcExtraAttackFor(victim, count);
457 }
458 }
459 }
461 }
462
463 // not implemented before 3.0.2
464 // xinef: if attack time > 0, reduce by diff
465 // if on next update, attack time < 0 assume player didnt attack - set to 0
466 bool suspendAttackTimer = false;
467 bool suspendRangedAttackTimer = false;
469 {
470 for (Spell* spell : m_currentSpells)
471 {
472 if (spell)
473 {
474 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
475 {
476 if (spell->IsChannelActive())
477 {
478 suspendRangedAttackTimer = true;
479 }
480
481 suspendAttackTimer = true;
482 break;
483 }
484 }
485 }
486 }
487
488 if (!suspendAttackTimer)
489 {
490 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
491 {
492 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
493 }
494
495 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
496 {
497 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
498 }
499 }
500
501 if (!suspendRangedAttackTimer)
502 {
503 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
504 {
505 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
506 }
507 }
508
509 // update abilities available only for fraction of time
510 UpdateReactives(p_time);
511
515
516 UpdateSplineMovement(p_time);
517 GetMotionMaster()->UpdateMotion(p_time);
518
520}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1326
bool IsEmpty() const
Definition LinkedList.h:97
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:236
void UpdateMotion(uint32 diff)
Definition MotionMaster.cpp:105
void _UpdateSpells(uint32 time)
Definition Unit.cpp:3881
void UpdateSplineMovement(uint32 t_diff)
Definition Unit.cpp:576
void UpdateReactives(uint32 p_time)
Definition Unit.cpp:16962
void ExecuteDelayedUnitAINotifyEvent()
Definition Unit.cpp:20265
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition Unit.cpp:2795
void SendThreatListUpdate()
Definition Unit.cpp:19839
virtual void Update(uint32 diff)
Definition Object.cpp:1051

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17192{
17193 if (slot >= MAX_AURAS) // slot not found, return
17194 return;
17195 if (Player* player = ToPlayer())
17196 {
17197 if (player->GetGroup())
17198 {
17199 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17200 player->SetAuraUpdateMaskForRaid(slot);
17201 }
17202 }
17203 else if (IsCreature() && IsPet())
17204 {
17205 Pet* pet = ((Pet*)this);
17206 if (pet->isControlled())
17207 {
17208 Unit* owner = GetOwner();
17209 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17210 {
17212 pet->SetAuraUpdateMaskForRaid(slot);
17213 }
17214 }
17215 }
17216}
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition Group.h:109
#define MAX_AURAS
Definition SpellAuraDefines.h:21
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15796{
15797 if (IsPlayer())
15798 return;
15799
15800 if (i_disabledAI) // disabled AI must be primary AI
15801 {
15802 if (!IsCharmed())
15803 {
15804 delete i_AI;
15806 i_disabledAI = nullptr;
15807 }
15808 }
15809 else
15810 {
15811 if (IsCharmed())
15812 {
15814 if (isPossessed() || IsVehicle())
15815 i_AI = new PossessedAI(ToCreature());
15816 else
15817 i_AI = new PetAI(ToCreature());
15818 }
15819 }
15820}
Definition PetAI.h:47
Definition PassiveAI.h:37

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:779

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

19833{
19835 if (IsVehicle())
19837}
void RelocatePassengers()
Definition Vehicle.cpp:516

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
769{
770 m_interruptMask = 0;
771 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
772 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
773
775 if (spell->getState() == SPELL_STATE_CASTING)
776 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
777}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

19825{
19826 SetOrientation(orientation);
19827 if (IsVehicle())
19829}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

19787{
19788 if (!Acore::IsValidMapCoord(x, y, z, orientation))
19789 return false;
19790
19791 float old_orientation = GetOrientation();
19792 float current_z = GetPositionZ();
19793 bool turn = (old_orientation != orientation);
19794 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
19795
19796 if (!GetVehicle())
19797 {
19798 uint32 mask = 0;
19799 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
19800 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
19801 if (mask)
19803 }
19804
19805 if (relocated)
19806 {
19807 if (IsPlayer())
19808 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
19809 else
19810 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
19811 }
19812 else if (turn)
19813 {
19814 UpdateOrientation(orientation);
19815
19816 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
19818 }
19819
19820 return (relocated || turn);
19821}
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:780
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:802
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition Unit.cpp:19824
bool IsValidMapCoord(float c)
Definition GridDefines.h:210

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMoverRelocation(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
16963{
16964 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
16965 {
16966 ReactiveType reactive = ReactiveType(i);
16967
16968 if (!m_reactiveTimer[reactive])
16969 continue;
16970
16971 if (m_reactiveTimer[reactive] <= p_time)
16972 {
16973 m_reactiveTimer[reactive] = 0;
16974
16975 switch (reactive)
16976 {
16977 case REACTIVE_DEFENSE:
16980 break;
16984 break;
16985 case REACTIVE_OVERPOWER:
16987 {
16989 }
16990 break;
16992 if (IsHunterPet())
16994 break;
16995 default:
16996 break;
16997 }
16998 }
16999 else
17000 {
17001 m_reactiveTimer[reactive] -= p_time;
17002 }
17003 }
17004}
ReactiveType
Definition Unit.h:602

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14335{
14336 int32 main_speed_mod = 0;
14337 float stack_bonus = 1.0f;
14338 float non_stack_bonus = 1.0f;
14339
14340 switch (mtype)
14341 {
14342 // Only apply debuffs
14343 case MOVE_FLIGHT_BACK:
14344 case MOVE_RUN_BACK:
14345 case MOVE_SWIM_BACK:
14346 case MOVE_WALK:
14347 break;
14348 case MOVE_RUN:
14349 {
14350 if (IsMounted()) // Use on mount auras
14351 {
14355 }
14356 else
14357 {
14361 }
14362 break;
14363 }
14364 case MOVE_SWIM:
14365 {
14366 // xinef: check for forced_speed_mod of sea turtle
14368 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14369 {
14370 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14371 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14372 {
14373 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14374 return;
14375 }
14376 else if (
14377 // case: increase speed
14378 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14379 // case: decrease speed
14380 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14381 )
14382 {
14383 main_speed_mod = (*itr)->GetAmount();
14384 }
14385 }
14386 break;
14387 }
14388 case MOVE_FLIGHT:
14389 {
14390 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14391 {
14394
14395 // for some spells this mod is applied on vehicle owner
14396 int32 owner_speed_mod = 0;
14397
14398 if (Unit* owner = GetCharmer())
14399 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14400
14401 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14402 }
14403 else if (IsMounted())
14404 {
14408 }
14409 else // Use not mount (shapeshift for example) auras (should stack)
14410 {
14414 }
14415
14416 // Update speed for vehicle if available
14417 if (IsPlayer() && GetVehicle())
14419 break;
14420 }
14421 default:
14422 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14423 return;
14424 }
14425
14426 // now we ready for speed calculation
14427 float speed = std::max(non_stack_bonus, stack_bonus);
14428 if (main_speed_mod)
14429 AddPct(speed, main_speed_mod);
14430
14431 switch (mtype)
14432 {
14433 case MOVE_RUN:
14434 case MOVE_SWIM:
14435 case MOVE_FLIGHT:
14436 {
14437 // Set creature speed rate
14438 if (IsCreature())
14439 {
14440 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14441 {
14442 // contant value for player pets
14443 speed *= 1.15f;
14444 }
14445 else
14446 {
14447 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14448 }
14449 }
14450
14451 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14454 {
14455 if (Creature* creature = ToCreature())
14456 {
14457 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14458 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14459 break;
14460 }
14461
14462 // Use speed from aura
14463 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14464 if (speed > max_speed)
14465 speed = max_speed;
14466 }
14467 break;
14468 }
14469 default:
14470 break;
14471 }
14472
14473 int32 slowFromHealth = 0;
14474 Creature* creature = ToCreature();
14475 // ignore pets, player owned vehicles, and mobs immune to snare
14476 if (creature
14477 && !IsPet()
14478 && !(IsControlledByPlayer() && IsVehicle())
14480 && !(creature->IsDungeonBoss()))
14481 {
14482 // 1.6% for each % under 30.
14483 // use min(0, health-30) so that we don't boost mobs above 30.
14484 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14485 }
14486
14487 if (slowFromHealth)
14488 {
14489 AddPct(speed, slowFromHealth);
14490 }
14491
14492 // Apply strongest slow aura mod to speed
14494 if (slow)
14495 AddPct(speed, slow);
14496
14497 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14498 {
14499 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14500 float min_speed = base_speed * (minSpeedMod / 100.0f);
14501 if (speed < min_speed)
14502 speed = min_speed;
14503 }
14504
14505 SetSpeed(mtype, speed, forced);
14506}
@ MECHANIC_DAZE
Definition SharedDefines.h:1363
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition SpellAuraDefines.h:254
@ MOVE_FLIGHT_BACK
Definition UnitDefines.h:360
@ MOVE_SWIM_BACK
Definition UnitDefines.h:357
@ MOVE_RUN_BACK
Definition UnitDefines.h:355
@ MOVE_WALK
Definition UnitDefines.h:353
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition Unit.cpp:14513
float speed_run
Definition CreatureData.h:201

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
577{
578 if (movespline->Finalized())
579 return;
580
581 // xinef: process movementinform
582 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
583 SplineHandler handler(this);
584 movespline->updateState(t_diff, handler);
585 // Xinef: Spline was cleared by StopMoving, return
586 if (!movespline->Initialized())
587 {
589 return;
590 }
591
592 bool arrived = movespline->Finalized();
593
594 if (arrived)
595 {
597
598 if (movespline->HasAnimation() && IsCreature() && IsAlive())
600 }
601
602 // pussywizard: update always! not every 400ms, because movement generators need the actual position
603 //m_movesplineTimer.Update(t_diff);
604 //if (m_movesplineTimer.Passed() || arrived)
606}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition UnitDefines.h:26
uint8 GetAnimationType() const
Definition MoveSpline.h:126
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:98
bool HasAnimation() const
Definition MoveSpline.h:125
Definition Unit.cpp:556

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
609{
610 //static uint32 const positionUpdateDelay = 400;
611
612 //m_movesplineTimer.Reset(positionUpdateDelay);
614
616 {
618 pos.m_positionX = loc.x;
619 pos.m_positionY = loc.y;
620 pos.m_positionZ = loc.z;
622
623 if (TransportBase* transport = GetDirectTransport())
624 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
625 }
626
627 // Xinef: if we had spline running update orientation along with position
628 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
629 // loc.orientation = GetOrientation();
630
631 if (IsPlayer())
632 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
633 else
634 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
635}
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3172
Location ComputePosition() const
Definition MoveSpline.cpp:26
bool onTransport
Definition MoveSpline.h:128
Definition VehicleDefines.h:130
TransportBase * GetDirectTransport() const
Definition Unit.cpp:18794
Position pos
Definition Object.h:309
Definition MoveSpline.h:27
float orientation
Definition MoveSpline.h:33
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21033{
21034 if (!target)
21035 {
21036 return;
21037 }
21038
21040 WorldPacket data;
21041 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21042 target->SendDirectMessage(&data);
21043}
LocaleConstant
Definition Common.h:117
@ CHAT_MSG_MONSTER_WHISPER
Definition SharedDefines.h:3417
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3444
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:560

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21091{
21092 if (!target)
21093 {
21094 return;
21095 }
21096
21097 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21098 if (!bct)
21099 {
21100 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21101 return;
21102 }
21103
21105 WorldPacket data;
21106 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21107 target->SendDirectMessage(&data);
21108}
Definition ObjectMgr.h:434

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21081{
21082 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21083}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _dualWieldMode

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

Referenced by Unit().

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_scAuras

AuraList Unit::m_scAuras
protected

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet

The documentation for this class was generated from the following files: